gh-129027: Raise DeprecationWarning for sys._clear_type_cache (#129043)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
This commit is contained in:
Srinivas Reddy Thatiparthy (తాటిపర్తి శ్రీనివాస్ రెడ్డి) 2025-04-25 17:31:48 +05:30 committed by GitHub
parent b402a4889b
commit 8783cec9b6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 37 additions and 7 deletions

View file

@ -153,3 +153,6 @@ although there is currently no date scheduled for their removal.
:class:`~xml.etree.ElementTree.Element` is deprecated. In a future release it :class:`~xml.etree.ElementTree.Element` is deprecated. In a future release it
will always return ``True``. Prefer explicit ``len(elem)`` or will always return ``True``. Prefer explicit ``len(elem)`` or
``elem is not None`` tests instead. ``elem is not None`` tests instead.
* :func:`sys._clear_type_cache` is deprecated:
use :func:`sys._clear_internal_caches` instead.

View file

@ -1246,6 +1246,9 @@ sys
* On FreeBSD, :data:`sys.platform` doesn't contain the major version anymore. * On FreeBSD, :data:`sys.platform` doesn't contain the major version anymore.
It is always ``'freebsd'``, instead of ``'freebsd13'`` or ``'freebsd14'``. It is always ``'freebsd'``, instead of ``'freebsd13'`` or ``'freebsd14'``.
* Raise :exc:`DeprecationWarning` for :func:`sys._clear_type_cache`. This
function was deprecated in Python 3.13 but it didn't raise a runtime warning.
sys.monitoring sys.monitoring
-------------- --------------

View file

@ -9,6 +9,7 @@ import sysconfig
import tempfile import tempfile
import textwrap import textwrap
import unittest import unittest
import warnings
from test import support from test import support
from test.support import os_helper from test.support import os_helper
from test.support import force_not_colorized from test.support import force_not_colorized
@ -936,14 +937,20 @@ class CmdLineTest(unittest.TestCase):
@unittest.skipUnless(sysconfig.get_config_var('Py_TRACE_REFS'), "Requires --with-trace-refs build option") @unittest.skipUnless(sysconfig.get_config_var('Py_TRACE_REFS'), "Requires --with-trace-refs build option")
def test_python_dump_refs(self): def test_python_dump_refs(self):
code = 'import sys; sys._clear_type_cache()' code = 'import sys; sys._clear_type_cache()'
rc, out, err = assert_python_ok('-c', code, PYTHONDUMPREFS='1') # TODO: Remove warnings context manager once sys._clear_type_cache is removed
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
rc, out, err = assert_python_ok('-c', code, PYTHONDUMPREFS='1')
self.assertEqual(rc, 0) self.assertEqual(rc, 0)
@unittest.skipUnless(sysconfig.get_config_var('Py_TRACE_REFS'), "Requires --with-trace-refs build option") @unittest.skipUnless(sysconfig.get_config_var('Py_TRACE_REFS'), "Requires --with-trace-refs build option")
def test_python_dump_refs_file(self): def test_python_dump_refs_file(self):
with tempfile.NamedTemporaryFile() as dump_file: with tempfile.NamedTemporaryFile() as dump_file:
code = 'import sys; sys._clear_type_cache()' code = 'import sys; sys._clear_type_cache()'
rc, out, err = assert_python_ok('-c', code, PYTHONDUMPREFSFILE=dump_file.name) # TODO: Remove warnings context manager once sys._clear_type_cache is removed
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
rc, out, err = assert_python_ok('-c', code, PYTHONDUMPREFSFILE=dump_file.name)
self.assertEqual(rc, 0) self.assertEqual(rc, 0)
with open(dump_file.name, 'r') as file: with open(dump_file.name, 'r') as file:
contents = file.read() contents = file.read()

View file

@ -891,7 +891,9 @@ class SysModuleTest(unittest.TestCase):
@test.support.cpython_only @test.support.cpython_only
def test_clear_type_cache(self): def test_clear_type_cache(self):
sys._clear_type_cache() with self.assertWarnsRegex(DeprecationWarning,
r"sys\._clear_type_cache\(\) is deprecated.*"):
sys._clear_type_cache()
@force_not_colorized @force_not_colorized
@support.requires_subprocess() @support.requires_subprocess()

View file

@ -1,6 +1,7 @@
""" Tests for the internal type cache in CPython. """ """ Tests for the internal type cache in CPython. """
import unittest
import dis import dis
import unittest
import warnings
from test import support from test import support
from test.support import import_helper, requires_specialization, requires_specialization_ft from test.support import import_helper, requires_specialization, requires_specialization_ft
try: try:
@ -16,6 +17,10 @@ type_assign_specific_version_unsafe = _testinternalcapi.type_assign_specific_ver
type_assign_version = _testcapi.type_assign_version type_assign_version = _testcapi.type_assign_version
type_modified = _testcapi.type_modified type_modified = _testcapi.type_modified
def clear_type_cache():
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
_clear_type_cache()
@support.cpython_only @support.cpython_only
@unittest.skipIf(_clear_type_cache is None, "requires sys._clear_type_cache") @unittest.skipIf(_clear_type_cache is None, "requires sys._clear_type_cache")
@ -38,7 +43,7 @@ class TypeCacheTests(unittest.TestCase):
append_result = all_version_tags.append append_result = all_version_tags.append
assertNotEqual = self.assertNotEqual assertNotEqual = self.assertNotEqual
for _ in range(30): for _ in range(30):
_clear_type_cache() clear_type_cache()
X = type('Y', (), {}) X = type('Y', (), {})
X.x = 1 X.x = 1
X.x X.x
@ -78,7 +83,7 @@ class TypeCacheTests(unittest.TestCase):
new_version = type_get_version(C) new_version = type_get_version(C)
self.assertEqual(new_version, orig_version + 5) self.assertEqual(new_version, orig_version + 5)
_clear_type_cache() clear_type_cache()
def test_per_class_limit(self): def test_per_class_limit(self):
class C: class C:
@ -112,7 +117,7 @@ class TypeCacheTests(unittest.TestCase):
@support.cpython_only @support.cpython_only
class TypeCacheWithSpecializationTests(unittest.TestCase): class TypeCacheWithSpecializationTests(unittest.TestCase):
def tearDown(self): def tearDown(self):
_clear_type_cache() clear_type_cache()
def _assign_valid_version_or_skip(self, type_): def _assign_valid_version_or_skip(self, type_):
type_modified(type_) type_modified(type_)

View file

@ -0,0 +1,2 @@
Raise :exc:`DeprecationWarning` for :func:`sys._clear_type_cache`. This function was deprecated in Python 3.13
but it didn't raise a runtime warning.

View file

@ -2208,6 +2208,14 @@ static PyObject *
sys__clear_type_cache_impl(PyObject *module) sys__clear_type_cache_impl(PyObject *module)
/*[clinic end generated code: output=20e48ca54a6f6971 input=127f3e04a8d9b555]*/ /*[clinic end generated code: output=20e48ca54a6f6971 input=127f3e04a8d9b555]*/
{ {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"sys._clear_type_cache() is deprecated and"
" scheduled for removal in a future version."
" Use sys._clear_internal_caches() instead.",
1) < 0)
{
return NULL;
}
PyType_ClearCache(); PyType_ClearCache();
Py_RETURN_NONE; Py_RETURN_NONE;
} }