summaryrefslogtreecommitdiffstats
path: root/Lib/importlib
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2023-05-03 11:55:22 (GMT)
committerGitHub <noreply@github.com>2023-05-03 11:55:22 (GMT)
commit326997829d02458246dfd5b6d03297e2418bde52 (patch)
tree05b94e8dbb81f6b7a8d9054bd773c3cf24e0797e /Lib/importlib
parentbcea36f8db9ad4fd542b38997e065987e829cb9f (diff)
downloadcpython-326997829d02458246dfd5b6d03297e2418bde52.zip
cpython-326997829d02458246dfd5b6d03297e2418bde52.tar.gz
cpython-326997829d02458246dfd5b6d03297e2418bde52.tar.bz2
gh-98040: Remove find_loader, find_module and other deprecated APIs (#98059)
* Remove deprecated classes from pkgutil * Remove some other PEP 302 obsolescence * Use find_spec instead of load_module * Remove more tests of PEP 302 obsolete APIs * Remove another bunch of tests using obsolete load_modules() * Remove deleted names from __all__ * Remove obsolete footnote * imp is removed * Remove `imp` from generated stdlib names * What's new and blurb * Update zipimport documentation for the removed methods * Fix some Windows tests * Remove any test (or part of a test) that references `find_module()`. * Use assertIsNone() / assertIsNotNone() consistently. * Update Doc/reference/import.rst * We don't need pkgutil._get_spec() any more either * test.test_importlib.fixtures.NullFinder * ...BadLoaderFinder.find_module * ...test_api.InvalidatingNullFinder.find_module * ...test.test_zipimport test of z.find_module * Suppress cross-references to find_loader and find_module * Suppress cross-references to Finder * Suppress cross-references to pkgutil.ImpImporter and pkgutil.ImpLoader --------- Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net> Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Diffstat (limited to 'Lib/importlib')
-rw-r--r--Lib/importlib/__init__.py34
-rw-r--r--Lib/importlib/_bootstrap.py41
-rw-r--r--Lib/importlib/_bootstrap_external.py95
-rw-r--r--Lib/importlib/abc.py92
4 files changed, 3 insertions, 259 deletions
diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py
index 21d9dee..707c081 100644
--- a/Lib/importlib/__init__.py
+++ b/Lib/importlib/__init__.py
@@ -70,40 +70,6 @@ def invalidate_caches():
finder.invalidate_caches()
-def find_loader(name, path=None):
- """Return the loader for the specified module.
-
- This is a backward-compatible wrapper around find_spec().
-
- This function is deprecated in favor of importlib.util.find_spec().
-
- """
- warnings.warn('Deprecated since Python 3.4 and slated for removal in '
- 'Python 3.12; use importlib.util.find_spec() instead',
- DeprecationWarning, stacklevel=2)
- try:
- loader = sys.modules[name].__loader__
- if loader is None:
- raise ValueError(f'{name}.__loader__ is None')
- else:
- return loader
- except KeyError:
- pass
- except AttributeError:
- raise ValueError(f'{name}.__loader__ is not set') from None
-
- spec = _bootstrap._find_spec(name, path)
- # We won't worry about malformed specs (missing attributes).
- if spec is None:
- return None
- if spec.loader is None:
- if spec.submodule_search_locations is None:
- raise ImportError(f'spec for {name} missing loader', name=name)
- raise ImportError('namespace packages do not have loaders',
- name=name)
- return spec.loader
-
-
def import_module(name, package=None):
"""Import a module.
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index e4fcaa6..c48fd50 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -892,21 +892,6 @@ class BuiltinImporter:
else:
return None
- @classmethod
- def find_module(cls, fullname, path=None):
- """Find the built-in module.
-
- If 'path' is ever specified then the search is considered a failure.
-
- This method is deprecated. Use find_spec() instead.
-
- """
- _warnings.warn("BuiltinImporter.find_module() is deprecated and "
- "slated for removal in Python 3.12; use find_spec() instead",
- DeprecationWarning)
- spec = cls.find_spec(fullname, path)
- return spec.loader if spec is not None else None
-
@staticmethod
def create_module(spec):
"""Create a built-in module"""
@@ -1076,18 +1061,6 @@ class FrozenImporter:
spec.submodule_search_locations.insert(0, pkgdir)
return spec
- @classmethod
- def find_module(cls, fullname, path=None):
- """Find a frozen module.
-
- This method is deprecated. Use find_spec() instead.
-
- """
- _warnings.warn("FrozenImporter.find_module() is deprecated and "
- "slated for removal in Python 3.12; use find_spec() instead",
- DeprecationWarning)
- return cls if _imp.is_frozen(fullname) else None
-
@staticmethod
def create_module(spec):
"""Set __file__, if able."""
@@ -1170,16 +1143,6 @@ def _resolve_name(name, package, level):
return f'{base}.{name}' if name else base
-def _find_spec_legacy(finder, name, path):
- msg = (f"{_object_name(finder)}.find_spec() not found; "
- "falling back to find_module()")
- _warnings.warn(msg, ImportWarning)
- loader = finder.find_module(name, path)
- if loader is None:
- return None
- return spec_from_loader(name, loader)
-
-
def _find_spec(name, path, target=None):
"""Find a module's spec."""
meta_path = sys.meta_path
@@ -1200,9 +1163,7 @@ def _find_spec(name, path, target=None):
try:
find_spec = finder.find_spec
except AttributeError:
- spec = _find_spec_legacy(finder, name, path)
- if spec is None:
- continue
+ continue
else:
spec = find_spec(name, path, target)
if spec is not None:
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index cb22737..7a3fdba 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -659,26 +659,6 @@ def _check_name(method):
return _check_name_wrapper
-def _find_module_shim(self, fullname):
- """Try to find a loader for the specified module by delegating to
- self.find_loader().
-
- This method is deprecated in favor of finder.find_spec().
-
- """
- _warnings.warn("find_module() is deprecated and "
- "slated for removal in Python 3.12; use find_spec() instead",
- DeprecationWarning)
- # Call find_loader(). If it returns a string (indicating this
- # is a namespace package portion), generate a warning and
- # return None.
- loader, portions = self.find_loader(fullname)
- if loader is None and len(portions):
- msg = f'Not importing directory {portions[0]}: missing __init__'
- _warnings.warn(msg, ImportWarning)
- return loader
-
-
def _classify_pyc(data, name, exc_details):
"""Perform basic validity checking of a pyc header and return the flags field,
which determines how the pyc should be further validated against the source.
@@ -985,22 +965,6 @@ class WindowsRegistryFinder:
origin=filepath)
return spec
- @classmethod
- def find_module(cls, fullname, path=None):
- """Find module named in the registry.
-
- This method is deprecated. Use find_spec() instead.
-
- """
- _warnings.warn("WindowsRegistryFinder.find_module() is deprecated and "
- "slated for removal in Python 3.12; use find_spec() instead",
- DeprecationWarning)
- spec = cls.find_spec(fullname, path)
- if spec is not None:
- return spec.loader
- else:
- return None
-
class _LoaderBasics:
@@ -1518,27 +1482,6 @@ class PathFinder:
return finder
@classmethod
- def _legacy_get_spec(cls, fullname, finder):
- # This would be a good place for a DeprecationWarning if
- # we ended up going that route.
- if hasattr(finder, 'find_loader'):
- msg = (f"{_bootstrap._object_name(finder)}.find_spec() not found; "
- "falling back to find_loader()")
- _warnings.warn(msg, ImportWarning)
- loader, portions = finder.find_loader(fullname)
- else:
- msg = (f"{_bootstrap._object_name(finder)}.find_spec() not found; "
- "falling back to find_module()")
- _warnings.warn(msg, ImportWarning)
- loader = finder.find_module(fullname)
- portions = []
- if loader is not None:
- return _bootstrap.spec_from_loader(fullname, loader)
- spec = _bootstrap.ModuleSpec(fullname, None)
- spec.submodule_search_locations = portions
- return spec
-
- @classmethod
def _get_spec(cls, fullname, path, target=None):
"""Find the loader or namespace_path for this module/package name."""
# If this ends up being a namespace package, namespace_path is
@@ -1549,10 +1492,7 @@ class PathFinder:
continue
finder = cls._path_importer_cache(entry)
if finder is not None:
- if hasattr(finder, 'find_spec'):
- spec = finder.find_spec(fullname, target)
- else:
- spec = cls._legacy_get_spec(fullname, finder)
+ spec = finder.find_spec(fullname, target)
if spec is None:
continue
if spec.loader is not None:
@@ -1594,22 +1534,6 @@ class PathFinder:
else:
return spec
- @classmethod
- def find_module(cls, fullname, path=None):
- """find the module on sys.path or 'path' based on sys.path_hooks and
- sys.path_importer_cache.
-
- This method is deprecated. Use find_spec() instead.
-
- """
- _warnings.warn("PathFinder.find_module() is deprecated and "
- "slated for removal in Python 3.12; use find_spec() instead",
- DeprecationWarning)
- spec = cls.find_spec(fullname, path)
- if spec is None:
- return None
- return spec.loader
-
@staticmethod
def find_distributions(*args, **kwargs):
"""
@@ -1654,23 +1578,6 @@ class FileFinder:
"""Invalidate the directory mtime."""
self._path_mtime = -1
- find_module = _find_module_shim
-
- def find_loader(self, fullname):
- """Try to find a loader for the specified module, or the namespace
- package portions. Returns (loader, list-of-portions).
-
- This method is deprecated. Use find_spec() instead.
-
- """
- _warnings.warn("FileFinder.find_loader() is deprecated and "
- "slated for removal in Python 3.12; use find_spec() instead",
- DeprecationWarning)
- spec = self.find_spec(fullname)
- if spec is None:
- return None, []
- return spec.loader, spec.submodule_search_locations or []
-
def _get_spec(self, loader_class, fullname, path, smsl, target):
loader = loader_class(fullname, path)
return spec_from_file_location(fullname, path, loader=loader,
diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
index 8fa9a0f..b56fa94 100644
--- a/Lib/importlib/abc.py
+++ b/Lib/importlib/abc.py
@@ -19,7 +19,7 @@ from .resources import abc as _resources_abc
__all__ = [
- 'Loader', 'Finder', 'MetaPathFinder', 'PathEntryFinder',
+ 'Loader', 'MetaPathFinder', 'PathEntryFinder',
'ResourceLoader', 'InspectLoader', 'ExecutionLoader',
'FileLoader', 'SourceLoader',
]
@@ -49,38 +49,6 @@ def _register(abstract_cls, *classes):
abstract_cls.register(frozen_cls)
-class Finder(metaclass=abc.ABCMeta):
-
- """Legacy abstract base class for import finders.
-
- It may be subclassed for compatibility with legacy third party
- reimplementations of the import system. Otherwise, finder
- implementations should derive from the more specific MetaPathFinder
- or PathEntryFinder ABCs.
-
- Deprecated since Python 3.3
- """
-
- def __init__(self):
- warnings.warn("the Finder ABC is deprecated and "
- "slated for removal in Python 3.12; use MetaPathFinder "
- "or PathEntryFinder instead",
- DeprecationWarning)
-
- @abc.abstractmethod
- def find_module(self, fullname, path=None):
- """An abstract method that should find a module.
- The fullname is a str and the optional path is a str or None.
- Returns a Loader object or None.
- """
- warnings.warn("importlib.abc.Finder along with its find_module() "
- "method are deprecated and "
- "slated for removal in Python 3.12; use "
- "MetaPathFinder.find_spec() or "
- "PathEntryFinder.find_spec() instead",
- DeprecationWarning)
-
-
class MetaPathFinder(metaclass=abc.ABCMeta):
"""Abstract base class for import finders on sys.meta_path."""
@@ -88,27 +56,6 @@ class MetaPathFinder(metaclass=abc.ABCMeta):
# We don't define find_spec() here since that would break
# hasattr checks we do to support backward compatibility.
- def find_module(self, fullname, path):
- """Return a loader for the module.
-
- If no module is found, return None. The fullname is a str and
- the path is a list of strings or None.
-
- This method is deprecated since Python 3.4 in favor of
- finder.find_spec(). If find_spec() exists then backwards-compatible
- functionality is provided for this method.
-
- """
- warnings.warn("MetaPathFinder.find_module() is deprecated since Python "
- "3.4 in favor of MetaPathFinder.find_spec() and is "
- "slated for removal in Python 3.12",
- DeprecationWarning,
- stacklevel=2)
- if not hasattr(self, 'find_spec'):
- return None
- found = self.find_spec(fullname, path)
- return found.loader if found is not None else None
-
def invalidate_caches(self):
"""An optional method for clearing the finder's cache, if any.
This method is used by importlib.invalidate_caches().
@@ -122,43 +69,6 @@ class PathEntryFinder(metaclass=abc.ABCMeta):
"""Abstract base class for path entry finders used by PathFinder."""
- # We don't define find_spec() here since that would break
- # hasattr checks we do to support backward compatibility.
-
- def find_loader(self, fullname):
- """Return (loader, namespace portion) for the path entry.
-
- The fullname is a str. The namespace portion is a sequence of
- path entries contributing to part of a namespace package. The
- sequence may be empty. If loader is not None, the portion will
- be ignored.
-
- The portion will be discarded if another path entry finder
- locates the module as a normal module or package.
-
- This method is deprecated since Python 3.4 in favor of
- finder.find_spec(). If find_spec() is provided than backwards-compatible
- functionality is provided.
- """
- warnings.warn("PathEntryFinder.find_loader() is deprecated since Python "
- "3.4 in favor of PathEntryFinder.find_spec() "
- "(available since 3.4)",
- DeprecationWarning,
- stacklevel=2)
- if not hasattr(self, 'find_spec'):
- return None, []
- found = self.find_spec(fullname)
- if found is not None:
- if not found.submodule_search_locations:
- portions = []
- else:
- portions = found.submodule_search_locations
- return found.loader, portions
- else:
- return None, []
-
- find_module = _bootstrap_external._find_module_shim
-
def invalidate_caches(self):
"""An optional method for clearing the finder's cache, if any.
This method is used by PathFinder.invalidate_caches().