: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`.)
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)
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.
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`.)
: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
---
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',
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.
>>> 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:
# 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:
.. 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`.
..
--- /dev/null
+Remove deprecated :func:`!pkgutil.get_loader` and :func:`!pkgutil.find_loader`.