summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBénédikt Tran <10796600+picnixz@users.noreply.github.com>2024-11-01 16:35:22 (GMT)
committerGitHub <noreply@github.com>2024-11-01 16:35:22 (GMT)
commit464a7a91d0c75241a2f1913e78dbfbc29d4193b4 (patch)
tree1e9d04bc545540f6eaa78976e2b4564fe922cfce
parent38a604fd90e765d5ac42373755397ab1e6cc0a39 (diff)
downloadcpython-464a7a91d0c75241a2f1913e78dbfbc29d4193b4.zip
cpython-464a7a91d0c75241a2f1913e78dbfbc29d4193b4.tar.gz
cpython-464a7a91d0c75241a2f1913e78dbfbc29d4193b4.tar.bz2
gh-97850: remove ``find_loader`` and ``get_loader`` from ``pkgutil`` (#119656)
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Brett Cannon <brett@python.org>
-rw-r--r--Doc/deprecations/pending-removal-in-3.14.rst2
-rw-r--r--Doc/library/pkgutil.rst40
-rw-r--r--Doc/whatsnew/3.12.rst2
-rw-r--r--Doc/whatsnew/3.14.rst7
-rw-r--r--Lib/pkgutil.py55
-rw-r--r--Lib/test/test_doctest/test_doctest.py19
-rw-r--r--Lib/test/test_pkgutil.py67
-rw-r--r--Misc/NEWS.d/3.12.0b1.rst2
-rw-r--r--Misc/NEWS.d/next/Library/2024-05-28-14-35-23.gh-issue-97850.dCtjel.rst1
9 files changed, 12 insertions, 183 deletions
diff --git a/Doc/deprecations/pending-removal-in-3.14.rst b/Doc/deprecations/pending-removal-in-3.14.rst
index b8791b8..23c9bde 100644
--- a/Doc/deprecations/pending-removal-in-3.14.rst
+++ b/Doc/deprecations/pending-removal-in-3.14.rst
@@ -85,7 +85,7 @@ Pending removal in Python 3.14
:meth:`~pathlib.PurePath.relative_to`: passing additional arguments is
deprecated.
-* :mod:`pkgutil`: :func:`~pkgutil.find_loader` and :func:`~pkgutil.get_loader`
+* :mod:`pkgutil`: :func:`!pkgutil.find_loader` and :func:!pkgutil.get_loader`
now raise :exc:`DeprecationWarning`;
use :func:`importlib.util.find_spec` instead.
(Contributed by Nikita Sobolev in :gh:`97850`.)
diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst
index 4a39d53..20b8f6b 100644
--- a/Doc/library/pkgutil.rst
+++ b/Doc/library/pkgutil.rst
@@ -49,25 +49,6 @@ support.
this function to raise an exception (in line with :func:`os.path.isdir`
behavior).
-.. function:: find_loader(fullname)
-
- Retrieve a module :term:`loader` for the given *fullname*.
-
- This is a backwards compatibility wrapper around
- :func:`importlib.util.find_spec` that converts most failures to
- :exc:`ImportError` and only returns the loader rather than the full
- :class:`importlib.machinery.ModuleSpec`.
-
- .. versionchanged:: 3.3
- Updated to be based directly on :mod:`importlib` rather than relying
- on the package internal :pep:`302` import emulation.
-
- .. versionchanged:: 3.4
- Updated to be based on :pep:`451`
-
- .. deprecated-removed:: 3.12 3.14
- Use :func:`importlib.util.find_spec` instead.
-
.. function:: get_importer(path_item)
@@ -84,27 +65,6 @@ support.
on the package internal :pep:`302` import emulation.
-.. function:: get_loader(module_or_name)
-
- Get a :term:`loader` object for *module_or_name*.
-
- If the module or package is accessible via the normal import mechanism, a
- wrapper around the relevant part of that machinery is returned. Returns
- ``None`` if the module cannot be found or imported. If the named module is
- not already imported, its containing package (if any) is imported, in order
- to establish the package ``__path__``.
-
- .. versionchanged:: 3.3
- Updated to be based directly on :mod:`importlib` rather than relying
- on the package internal :pep:`302` import emulation.
-
- .. versionchanged:: 3.4
- Updated to be based on :pep:`451`
-
- .. deprecated-removed:: 3.12 3.14
- Use :func:`importlib.util.find_spec` instead.
-
-
.. function:: iter_importers(fullname='')
Yield :term:`finder` objects for the given module name.
diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst
index 1354355..3640095 100644
--- a/Doc/whatsnew/3.12.rst
+++ b/Doc/whatsnew/3.12.rst
@@ -1229,7 +1229,7 @@ Deprecated
your code *requires* ``'fork'``. See :ref:`contexts and start methods
<multiprocessing-start-methods>`.
-* :mod:`pkgutil`: :func:`pkgutil.find_loader` and :func:`pkgutil.get_loader`
+* :mod:`pkgutil`: :func:`!pkgutil.find_loader` and :func:`!pkgutil.get_loader`
are deprecated and will be removed in Python 3.14;
use :func:`importlib.util.find_spec` instead.
(Contributed by Nikita Sobolev in :gh:`97850`.)
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 48314f9..db32be8 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -621,6 +621,13 @@ pathlib
:meth:`~pathlib.PurePath.is_relative_to`. In previous versions, any such
arguments are joined onto *other*.
+pkgutil
+-------
+
+* Remove deprecated :func:`!pkgutil.get_loader` and :func:`!pkgutil.find_loader`.
+ These had previously raised a :exc:`DeprecationWarning` since Python 3.12.
+ (Contributed by Bénédikt Tran in :gh:`97850`.)
+
pty
---
diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py
index dccbec5..b84d72f 100644
--- a/Lib/pkgutil.py
+++ b/Lib/pkgutil.py
@@ -12,7 +12,7 @@ from types import ModuleType
import warnings
__all__ = [
- 'get_importer', 'iter_importers', 'get_loader', 'find_loader',
+ 'get_importer', 'iter_importers',
'walk_packages', 'iter_modules', 'get_data',
'read_code', 'extend_path',
'ModuleInfo',
@@ -263,59 +263,6 @@ def iter_importers(fullname=""):
yield get_importer(item)
-def get_loader(module_or_name):
- """Get a "loader" object for module_or_name
-
- Returns None if the module cannot be found or imported.
- If the named module is not already imported, its containing package
- (if any) is imported, in order to establish the package __path__.
- """
- warnings._deprecated("pkgutil.get_loader",
- f"{warnings._DEPRECATED_MSG}; "
- "use importlib.util.find_spec() instead",
- remove=(3, 14))
- if module_or_name in sys.modules:
- module_or_name = sys.modules[module_or_name]
- if module_or_name is None:
- return None
- if isinstance(module_or_name, ModuleType):
- module = module_or_name
- loader = getattr(module, '__loader__', None)
- if loader is not None:
- return loader
- if getattr(module, '__spec__', None) is None:
- return None
- fullname = module.__name__
- else:
- fullname = module_or_name
- return find_loader(fullname)
-
-
-def find_loader(fullname):
- """Find a "loader" object for fullname
-
- This is a backwards compatibility wrapper around
- importlib.util.find_spec that converts most failures to ImportError
- and only returns the loader rather than the full spec
- """
- warnings._deprecated("pkgutil.find_loader",
- f"{warnings._DEPRECATED_MSG}; "
- "use importlib.util.find_spec() instead",
- remove=(3, 14))
- if fullname.startswith('.'):
- msg = "Relative module name {!r} not supported".format(fullname)
- raise ImportError(msg)
- try:
- spec = importlib.util.find_spec(fullname)
- except (ImportError, AttributeError, TypeError, ValueError) as ex:
- # This hack fixes an impedance mismatch between pkgutil and
- # importlib, where the latter raises other errors for cases where
- # pkgutil previously raised ImportError
- msg = "Error while finding loader for {!r} ({}: {})"
- raise ImportError(msg.format(fullname, type(ex), ex)) from ex
- return spec.loader if spec is not None else None
-
-
def extend_path(path, name):
"""Extend a package's path.
diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py
index 171412c..b1e165f 100644
--- a/Lib/test/test_doctest/test_doctest.py
+++ b/Lib/test/test_doctest/test_doctest.py
@@ -2410,25 +2410,6 @@ def test_DocFileSuite():
>>> suite.run(unittest.TestResult())
<unittest.result.TestResult run=3 errors=0 failures=2>
- Support for using a package's __loader__.get_data() is also
- provided.
-
- >>> import unittest, pkgutil, test
- >>> added_loader = False
- >>> if not hasattr(test, '__loader__'):
- ... test.__loader__ = pkgutil.get_loader(test)
- ... added_loader = True
- >>> try:
- ... suite = doctest.DocFileSuite('test_doctest.txt',
- ... 'test_doctest2.txt',
- ... 'test_doctest4.txt',
- ... package='test.test_doctest')
- ... suite.run(unittest.TestResult())
- ... finally:
- ... if added_loader:
- ... del test.__loader__
- <unittest.result.TestResult run=3 errors=0 failures=2>
-
'/' should be used as a path separator. It will be converted
to a native separator at run time:
diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py
index ca69275..736b837 100644
--- a/Lib/test/test_pkgutil.py
+++ b/Lib/test/test_pkgutil.py
@@ -607,73 +607,6 @@ class ImportlibMigrationTests(unittest.TestCase):
# PEP 302 emulation in this module is in the process of being
# deprecated in favour of importlib proper
- @unittest.skipIf(__name__ == '__main__', 'not compatible with __main__')
- @ignore_warnings(category=DeprecationWarning)
- def test_get_loader_handles_missing_loader_attribute(self):
- global __loader__
- this_loader = __loader__
- del __loader__
- try:
- self.assertIsNotNone(pkgutil.get_loader(__name__))
- finally:
- __loader__ = this_loader
-
- @ignore_warnings(category=DeprecationWarning)
- def test_get_loader_handles_missing_spec_attribute(self):
- name = 'spam'
- mod = type(sys)(name)
- del mod.__spec__
- with CleanImport(name):
- try:
- sys.modules[name] = mod
- loader = pkgutil.get_loader(name)
- finally:
- sys.modules.pop(name, None)
- self.assertIsNone(loader)
-
- @ignore_warnings(category=DeprecationWarning)
- def test_get_loader_handles_spec_attribute_none(self):
- name = 'spam'
- mod = type(sys)(name)
- mod.__spec__ = None
- with CleanImport(name):
- try:
- sys.modules[name] = mod
- loader = pkgutil.get_loader(name)
- finally:
- sys.modules.pop(name, None)
- self.assertIsNone(loader)
-
- @ignore_warnings(category=DeprecationWarning)
- def test_get_loader_None_in_sys_modules(self):
- name = 'totally bogus'
- sys.modules[name] = None
- try:
- loader = pkgutil.get_loader(name)
- finally:
- del sys.modules[name]
- self.assertIsNone(loader)
-
- def test_get_loader_is_deprecated(self):
- with check_warnings(
- (r".*\bpkgutil.get_loader\b.*", DeprecationWarning),
- ):
- res = pkgutil.get_loader("sys")
- self.assertIsNotNone(res)
-
- def test_find_loader_is_deprecated(self):
- with check_warnings(
- (r".*\bpkgutil.find_loader\b.*", DeprecationWarning),
- ):
- res = pkgutil.find_loader("sys")
- self.assertIsNotNone(res)
-
- @ignore_warnings(category=DeprecationWarning)
- def test_find_loader_missing_module(self):
- name = 'totally bogus'
- loader = pkgutil.find_loader(name)
- self.assertIsNone(loader)
-
def test_get_importer_avoids_emulation(self):
# We use an illegal path so *none* of the path hooks should fire
with check_warnings() as w:
diff --git a/Misc/NEWS.d/3.12.0b1.rst b/Misc/NEWS.d/3.12.0b1.rst
index 7126e08..3a3870a 100644
--- a/Misc/NEWS.d/3.12.0b1.rst
+++ b/Misc/NEWS.d/3.12.0b1.rst
@@ -1750,7 +1750,7 @@ Remove the long-deprecated ``imp`` module.
.. nonce: N46coo
.. section: Library
-Deprecate :func:`pkgutil.find_loader` and :func:`pkgutil.get_loader` in
+Deprecate :func:`!pkgutil.find_loader` and :func:`!pkgutil.get_loader` in
favor of :func:`importlib.util.find_spec`.
..
diff --git a/Misc/NEWS.d/next/Library/2024-05-28-14-35-23.gh-issue-97850.dCtjel.rst b/Misc/NEWS.d/next/Library/2024-05-28-14-35-23.gh-issue-97850.dCtjel.rst
new file mode 100644
index 0000000..bb94f7d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-05-28-14-35-23.gh-issue-97850.dCtjel.rst
@@ -0,0 +1 @@
+Remove deprecated :func:`!pkgutil.get_loader` and :func:`!pkgutil.find_loader`.