diff --git a/Doc/deprecations/pending-removal-in-future.rst b/Doc/deprecations/pending-removal-in-future.rst index 30d7d579705f2d..24e8853da90621 100644 --- a/Doc/deprecations/pending-removal-in-future.rst +++ b/Doc/deprecations/pending-removal-in-future.rst @@ -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 will always return ``True``. Prefer explicit ``len(elem)`` or ``elem is not None`` tests instead. + +* :func:`sys._clear_type_cache` is deprecated: + use :func:`sys._clear_internal_caches` instead. diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 5b03bd9e5a8caf..53dca6005bc029 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1203,6 +1203,9 @@ sys * On FreeBSD, :data:`sys.platform` doesn't contain the major version anymore. 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 -------------- diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index e1d1d03d4ff698..36f87e259e794d 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -9,6 +9,7 @@ import tempfile import textwrap import unittest +import warnings from test import support from test.support import os_helper from test.support import force_not_colorized @@ -936,14 +937,20 @@ def test_python_asyncio_debug(self): @unittest.skipUnless(sysconfig.get_config_var('Py_TRACE_REFS'), "Requires --with-trace-refs build option") def test_python_dump_refs(self): 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) @unittest.skipUnless(sysconfig.get_config_var('Py_TRACE_REFS'), "Requires --with-trace-refs build option") def test_python_dump_refs_file(self): with tempfile.NamedTemporaryFile() as dump_file: 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) with open(dump_file.name, 'r') as file: contents = file.read() diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index f9bac3fe351867..56413d00823f4a 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -891,7 +891,9 @@ def test_sys_getwindowsversion_no_instantiation(self): @test.support.cpython_only 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 @support.requires_subprocess() diff --git a/Lib/test/test_type_cache.py b/Lib/test/test_type_cache.py index ee64f89358ed55..7469a1047f81d7 100644 --- a/Lib/test/test_type_cache.py +++ b/Lib/test/test_type_cache.py @@ -1,6 +1,7 @@ """ Tests for the internal type cache in CPython. """ -import unittest import dis +import unittest +import warnings from test import support from test.support import import_helper, requires_specialization, requires_specialization_ft try: @@ -16,6 +17,10 @@ type_assign_version = _testcapi.type_assign_version type_modified = _testcapi.type_modified +def clear_type_cache(): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + _clear_type_cache() @support.cpython_only @unittest.skipIf(_clear_type_cache is None, "requires sys._clear_type_cache") @@ -38,7 +43,7 @@ def test_tp_version_tag_unique(self): append_result = all_version_tags.append assertNotEqual = self.assertNotEqual for _ in range(30): - _clear_type_cache() + clear_type_cache() X = type('Y', (), {}) X.x = 1 X.x @@ -78,7 +83,7 @@ class C: new_version = type_get_version(C) self.assertEqual(new_version, orig_version + 5) - _clear_type_cache() + clear_type_cache() def test_per_class_limit(self): class C: @@ -112,7 +117,7 @@ class HolderSub(Holder): @support.cpython_only class TypeCacheWithSpecializationTests(unittest.TestCase): def tearDown(self): - _clear_type_cache() + clear_type_cache() def _assign_valid_version_or_skip(self, type_): type_modified(type_) diff --git a/Misc/NEWS.d/next/Library/2025-01-21-11-48-19.gh-issue-129027.w0vxzZ.rst b/Misc/NEWS.d/next/Library/2025-01-21-11-48-19.gh-issue-129027.w0vxzZ.rst new file mode 100644 index 00000000000000..d2abf53bc0f72a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-01-21-11-48-19.gh-issue-129027.w0vxzZ.rst @@ -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. diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 3e0165acd6fb8c..1a7b01bf97f8f8 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2208,6 +2208,14 @@ static PyObject * sys__clear_type_cache_impl(PyObject *module) /*[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(); Py_RETURN_NONE; }