diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 525efc405c8520..50d368fe69db92 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -251,6 +251,10 @@ Deprecated :exc:`ImportWarning`). (Contributed by Brett Cannon in :gh:`65961`.) +* :func:`pkgutil.find_module` and :func:`pkgutil.get_module` + now raise :exc:`DeprecationWarning`, + use :func:`importlib.util.find_spec` instead. + Pending Removal in Python 3.13 ------------------------------ diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index bdebfd2fc8ac32..314c6f5cb9443d 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -465,6 +465,10 @@ def get_loader(module_or_name): If the named module is not already imported, its containing package (if any) is imported, in order to establish the package __path__. """ + warnings.warn("`pkgutil.get_loader` is deprecated since Python 3.12; " + "this function is slated for removal in Python 3.14, " + "use `importlib.util.find_spec` instead", + DeprecationWarning) if module_or_name in sys.modules: module_or_name = sys.modules[module_or_name] if module_or_name is None: @@ -489,6 +493,10 @@ def find_loader(fullname): importlib.util.find_spec that converts most failures to ImportError and only returns the loader rather than the full spec """ + warnings.warn("`pkgutil.find_loader` is deprecated since Python 3.12; " + "this function is slated for removal in Python 3.14, " + "use `importlib.util.find_spec` instead", + DeprecationWarning) if fullname.startswith('.'): msg = "Relative module name {!r} not supported".format(fullname) raise ImportError(msg) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py index 0cc99e0cc22763..c75e2d9736732c 100644 --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -10,6 +10,7 @@ import os.path import tempfile import shutil +import warnings import zipfile # Note: pkgutil.walk_packages is currently tested in test_runpy. This is @@ -549,12 +550,16 @@ def test_loader_deprecated(self): with self.check_deprecated(): pkgutil.ImpLoader("", "", "", "") - def test_get_loader_avoids_emulation(self): - with check_warnings() as w: - self.assertIsNotNone(pkgutil.get_loader("sys")) - self.assertIsNotNone(pkgutil.get_loader("os")) - self.assertIsNotNone(pkgutil.get_loader("test.support")) - self.assertEqual(len(w.warnings), 0) + def test_get_loader_is_deprecated(self): + for module in ["sys", "os", "test.support"]: + with check_warnings(( + "`pkgutil.get_loader` is deprecated since Python 3.12; " + "this function is slated for removal in Python 3.14, " + "use `importlib.util.find_spec` instead", + DeprecationWarning, + )): + res = pkgutil.get_loader(module) + self.assertIsNotNone(res) @unittest.skipIf(__name__ == '__main__', 'not compatible with __main__') def test_get_loader_handles_missing_loader_attribute(self): @@ -562,9 +567,9 @@ def test_get_loader_handles_missing_loader_attribute(self): this_loader = __loader__ del __loader__ try: - with check_warnings() as w: + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) self.assertIsNotNone(pkgutil.get_loader(__name__)) - self.assertEqual(len(w.warnings), 0) finally: __loader__ = this_loader @@ -600,12 +605,16 @@ def test_find_loader_missing_module(self): loader = pkgutil.find_loader(name) self.assertIsNone(loader) - def test_find_loader_avoids_emulation(self): - with check_warnings() as w: - self.assertIsNotNone(pkgutil.find_loader("sys")) - self.assertIsNotNone(pkgutil.find_loader("os")) - self.assertIsNotNone(pkgutil.find_loader("test.support")) - self.assertEqual(len(w.warnings), 0) + def test_find_loader_is_deprecated(self): + for module in ["sys", "os", "test.support"]: + with check_warnings(( + "`pkgutil.find_loader` is deprecated since Python 3.12; " + "this function is slated for removal in Python 3.14, " + "use `importlib.util.find_spec` instead", + DeprecationWarning, + )): + res = pkgutil.find_loader(module) + self.assertIsNotNone(res) def test_get_importer_avoids_emulation(self): # We use an illegal path so *none* of the path hooks should fire diff --git a/Misc/NEWS.d/next/Library/2022-10-21-16-23-31.gh-issue-97850.N46coo.rst b/Misc/NEWS.d/next/Library/2022-10-21-16-23-31.gh-issue-97850.N46coo.rst new file mode 100644 index 00000000000000..77d525e1a4a549 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-10-21-16-23-31.gh-issue-97850.N46coo.rst @@ -0,0 +1 @@ +Deprecate :func:`pkgutil.find_module` and :func:`pkgutil.get_module`.