summaryrefslogtreecommitdiffstats
path: root/Lib/importlib
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-06-17 21:15:59 (GMT)
committerGitHub <noreply@github.com>2020-06-17 21:15:59 (GMT)
commit9e09849d20987c131b28bcdd252e53440d4cd1b3 (patch)
tree92d787be6889fe22f233f40f40556f66e89bac1d /Lib/importlib
parent236a0f5cf022b59dbb6ea17a8e7a677c573d39b9 (diff)
downloadcpython-9e09849d20987c131b28bcdd252e53440d4cd1b3.zip
cpython-9e09849d20987c131b28bcdd252e53440d4cd1b3.tar.gz
cpython-9e09849d20987c131b28bcdd252e53440d4cd1b3.tar.bz2
bpo-41006: importlib.util no longer imports typing (GH-20938)
Create importlib._abc submodule to avoid importing typing when importlib.util is imported. Move Loader ABC into importlib._abc.
Diffstat (limited to 'Lib/importlib')
-rw-r--r--Lib/importlib/_abc.py50
-rw-r--r--Lib/importlib/abc.py48
-rw-r--r--Lib/importlib/util.py4
3 files changed, 53 insertions, 49 deletions
diff --git a/Lib/importlib/_abc.py b/Lib/importlib/_abc.py
new file mode 100644
index 0000000..fb5ec72
--- /dev/null
+++ b/Lib/importlib/_abc.py
@@ -0,0 +1,50 @@
+"""Subset of importlib.abc used to reduce importlib.util imports."""
+from . import _bootstrap
+import abc
+
+
+class Loader(metaclass=abc.ABCMeta):
+
+ """Abstract base class for import loaders."""
+
+ def create_module(self, spec):
+ """Return a module to initialize and into which to load.
+
+ This method should raise ImportError if anything prevents it
+ from creating a new module. It may return None to indicate
+ that the spec should create the new module.
+ """
+ # By default, defer to default semantics for the new module.
+ return None
+
+ # We don't define exec_module() here since that would break
+ # hasattr checks we do to support backward compatibility.
+
+ def load_module(self, fullname):
+ """Return the loaded module.
+
+ The module must be added to sys.modules and have import-related
+ attributes set properly. The fullname is a str.
+
+ ImportError is raised on failure.
+
+ This method is deprecated in favor of loader.exec_module(). If
+ exec_module() exists then it is used to provide a backwards-compatible
+ functionality for this method.
+
+ """
+ if not hasattr(self, 'exec_module'):
+ raise ImportError
+ return _bootstrap._load_module_shim(self, fullname)
+
+ def module_repr(self, module):
+ """Return a module's repr.
+
+ Used by the module type when the method does not raise
+ NotImplementedError.
+
+ This method is deprecated.
+
+ """
+ # The exception will cause ModuleType.__repr__ to ignore this method.
+ raise NotImplementedError
diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
index 0b20e7c..97d5afa 100644
--- a/Lib/importlib/abc.py
+++ b/Lib/importlib/abc.py
@@ -12,6 +12,7 @@ try:
import _frozen_importlib_external
except ImportError:
_frozen_importlib_external = _bootstrap_external
+from ._abc import Loader
import abc
import warnings
from typing import Protocol, runtime_checkable
@@ -134,53 +135,6 @@ class PathEntryFinder(Finder):
_register(PathEntryFinder, machinery.FileFinder)
-class Loader(metaclass=abc.ABCMeta):
-
- """Abstract base class for import loaders."""
-
- def create_module(self, spec):
- """Return a module to initialize and into which to load.
-
- This method should raise ImportError if anything prevents it
- from creating a new module. It may return None to indicate
- that the spec should create the new module.
- """
- # By default, defer to default semantics for the new module.
- return None
-
- # We don't define exec_module() here since that would break
- # hasattr checks we do to support backward compatibility.
-
- def load_module(self, fullname):
- """Return the loaded module.
-
- The module must be added to sys.modules and have import-related
- attributes set properly. The fullname is a str.
-
- ImportError is raised on failure.
-
- This method is deprecated in favor of loader.exec_module(). If
- exec_module() exists then it is used to provide a backwards-compatible
- functionality for this method.
-
- """
- if not hasattr(self, 'exec_module'):
- raise ImportError
- return _bootstrap._load_module_shim(self, fullname)
-
- def module_repr(self, module):
- """Return a module's repr.
-
- Used by the module type when the method does not raise
- NotImplementedError.
-
- This method is deprecated.
-
- """
- # The exception will cause ModuleType.__repr__ to ignore this method.
- raise NotImplementedError
-
-
class ResourceLoader(Loader):
"""Abstract base class for loaders which can return data from their
diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py
index 269a6fa..1e44843 100644
--- a/Lib/importlib/util.py
+++ b/Lib/importlib/util.py
@@ -1,5 +1,5 @@
"""Utility code for constructing importers, etc."""
-from . import abc
+from ._abc import Loader
from ._bootstrap import module_from_spec
from ._bootstrap import _resolve_name
from ._bootstrap import spec_from_loader
@@ -263,7 +263,7 @@ class _LazyModule(types.ModuleType):
delattr(self, attr)
-class LazyLoader(abc.Loader):
+class LazyLoader(Loader):
"""A loader that creates a module which defers loading until attribute access."""