Skip to content

Commit

Permalink
pythongh-97850: Deprecate find_module and get_module in pkgutil
Browse files Browse the repository at this point in the history
  • Loading branch information
sobolevn committed Oct 21, 2022
1 parent 8367ca1 commit b7de6df
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 14 deletions.
4 changes: 4 additions & 0 deletions Doc/whatsnew/3.12.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
------------------------------
Expand Down
8 changes: 8 additions & 0 deletions Lib/pkgutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand Down
37 changes: 23 additions & 14 deletions Lib/test/test_pkgutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -549,22 +550,26 @@ 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):
global __loader__
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

Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Deprecate :func:`pkgutil.find_module` and :func:`pkgutil.get_module`.

0 comments on commit b7de6df

Please sign in to comment.