summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2009-01-22 22:43:07 (GMT)
committerBrett Cannon <bcannon@gmail.com>2009-01-22 22:43:07 (GMT)
commit5abdc93eb85bc434c3b81b6c7fd1f05e7c9b5fb8 (patch)
tree17dbd10a78d4efc28ab798d9cdb3146419223c28 /Lib
parent7b3c89d88cac53325b30f583643d288426d90789 (diff)
downloadcpython-5abdc93eb85bc434c3b81b6c7fd1f05e7c9b5fb8.zip
cpython-5abdc93eb85bc434c3b81b6c7fd1f05e7c9b5fb8.tar.gz
cpython-5abdc93eb85bc434c3b81b6c7fd1f05e7c9b5fb8.tar.bz2
Add importlib.machinery with its first tenants, BuitinImporter and
FrozenImporter. Docs forthcoming. I plan on all finders and loaders (and most likely hooks) to live in imoprtlib.machinery. Utility stuff will end up in importlib.util. Higher-level API stuff will stay on imoprtlib directly (e.g. import_module).
Diffstat (limited to 'Lib')
-rw-r--r--Lib/importlib/NOTES33
-rw-r--r--Lib/importlib/_bootstrap.py91
-rw-r--r--Lib/importlib/machinery.py4
-rw-r--r--Lib/importlib/test/builtin/test_finder.py4
-rw-r--r--Lib/importlib/test/builtin/test_loader.py3
-rw-r--r--Lib/importlib/test/frozen/test_finder.py4
-rw-r--r--Lib/importlib/test/frozen/test_loader.py4
7 files changed, 68 insertions, 75 deletions
diff --git a/Lib/importlib/NOTES b/Lib/importlib/NOTES
index e0ca28c..028f789 100644
--- a/Lib/importlib/NOTES
+++ b/Lib/importlib/NOTES
@@ -1,9 +1,16 @@
to do
/////
+* Document:
+
+ + The terms "importer", "finder", and "loader".
+ + machinery.BuiltinImporter.
+ + machinery.FrozenImporter.
+
* Expose resolve_name().
* Backport to Python 2.7.
+
+ import_module
+ resolve_name
@@ -11,9 +18,11 @@ to do
that various implementations can just subclass as needed.
* Expose built-in and frozen importers.
+
+ Make staticmethods so that class can be used directly.
* Reorganize support code.
+
+ Separate general support code and importer-specific (e.g. source) support
code.
- Create support modules for each subdirectory (as needed).
@@ -22,12 +31,14 @@ to do
- Use in source/test_load_module_mixed.
* API simplification?
+
+ read_source -> get_data/source_path
+ read_bytecode -> get_data/bytecode_path
+ write_bytecode -> complete set of bytes for bytecode instead of
individual arguments.
* Implement PEP 302 protocol for loaders (should just be a matter of testing).
+
+ Built-in.
+ Frozen.
+ Extension.
@@ -36,39 +47,59 @@ to do
* Create meta_path importer for sys.path.
* OPTIMIZE!
+
+ Write benchmark suite.
+ Fast path common cases.
+
- Absolute name from sys.path.
- Relative name from sys.path.
* Public API to expose (w/ docs!)
+
+ abc
+
- Finder
+
* find_module
+
- Loader
+
* load_module
+
- ResourceLoader(Loader)
+
* get_data
+
- InspectLoader(Loader)
+
* is_package
* get_code
* get_source
+
- (?) SourceLoader(ResourceLoader)
+
* source_path
* bytecode_path
* write_bytecode
+
+ util
+
- get_module decorator (new name)
- check_name decorator (new name)
- + hooks (?)
+
+ + machinery
+
- (?) Chained path hook/finder
- BuiltinImporter
- FrozenImporter
- (?) FileFinder
- Extensions importers
+
* ExtensionFinder
* (?) Loader
+
- Source/bytecode importers
+
* SourceFinder
* (?) Loader
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 196c6d8..d11513a 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -90,60 +90,17 @@ class closing:
self.obj.close()
-class _BuiltinFrozenBaseLoader(object):
+class BuiltinImporter:
- """Base class for meta_path loaders for built-in and frozen modules.
+ """Meta path loader for built-in modules.
- Subclasses must implement:
-
- * _find(fullname:str) -> bool
- Finder which returns whether the class can handle the module.
-
- * _load(fullname:str) -> module
- Loader which returns the loaded module. The check for sys.modules
- does not need to be handled by this method.
-
- * type_:str
- Name of the type of module being handled. Used in error messages.
+ All methods are either class or static methods, allowing direct use of the
+ class.
"""
- def find_module(self, fullname, path=None):
- """Find a module."""
- if not self._find(fullname):
- return None
- return self
-
- def load_module(self, fullname):
- """Load a module."""
- try:
- return sys.modules[fullname]
- except KeyError:
- pass
- mod = self._load(fullname)
- if not mod:
- raise ImportError("expected {0} module not "
- "loaded".format(self.type_))
- return mod
-
-
-class BuiltinImporter(_BuiltinFrozenBaseLoader):
-
- """Meta path loader for built-in modules."""
-
- type_ = "built-in"
-
- def __init__(self):
- """Set the methods needed by the class.
-
- Cannot be set at the class level because the imp module is not
- necessarily injected until after the class is created.
-
- """
- self._find = imp.is_builtin
- self._load = imp.init_builtin
-
- def find_module(self, fullname, path=None):
+ @classmethod
+ def find_module(cls, fullname, path=None):
"""Try to find the built-in module.
If 'path' is ever specified then the search is considered a failure.
@@ -151,36 +108,36 @@ class BuiltinImporter(_BuiltinFrozenBaseLoader):
"""
if path is not None:
return None
- return super().find_module(fullname, path)
+ return cls if imp.is_builtin(fullname) else None
- def load_module(self, fullname):
+ @staticmethod
+ def load_module(fullname):
"""Load a built-in module."""
if fullname not in sys.builtin_module_names:
raise ImportError("{0} is not a built-in module".format(fullname))
- return super().load_module(fullname)
-
+ return imp.init_builtin(fullname)
-class FrozenImporter(_BuiltinFrozenBaseLoader):
- """Meta path class for importing frozen modules."""
+class FrozenImporter:
- type_ = 'frozen'
+ """Meta path class for importing frozen modules.
- def __init__(self):
- """Specify the methods needed by the superclass.
+ All methods are either class or static method to allow direct use of the
+ class.
- Because imp may not be injected until after class creation these
- methods cannot be set at the class level.
+ """
- """
- self._find = imp.is_frozen
- self._load = imp.init_frozen
+ @classmethod
+ def find_module(cls, fullname, path=None):
+ """Find a frozen module."""
+ return cls if imp.is_frozen(fullname) else None
- def load_module(self, fullname):
+ @classmethod
+ def load_module(cls, fullname):
"""Load a frozen module."""
- if not self.find_module(fullname):
+ if cls.find_module(fullname) is None:
raise ImportError("{0} is not a frozen module".format(fullname))
- return super().load_module(fullname)
+ return imp.init_frozen(fullname)
class ChainedImporter(object):
@@ -707,7 +664,7 @@ class Import(object):
"""Store a default path hook entry and a sequence to internally extend
sys.meta_path by (passing in None uses default importers)."""
if extended_meta_path is None:
- self.extended_meta_path = BuiltinImporter(), FrozenImporter()
+ self.extended_meta_path = BuiltinImporter, FrozenImporter
else:
self.extended_meta_path = extended_meta_path
self.default_path_hook = default_path_hook
diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py
new file mode 100644
index 0000000..40d39f4
--- /dev/null
+++ b/Lib/importlib/machinery.py
@@ -0,0 +1,4 @@
+"""The machinery of importlib: finders, loaders, hooks, etc."""
+
+from ._bootstrap import BuiltinImporter
+from ._bootstrap import FrozenImporter
diff --git a/Lib/importlib/test/builtin/test_finder.py b/Lib/importlib/test/builtin/test_finder.py
index 5262aaa..7d7ff36 100644
--- a/Lib/importlib/test/builtin/test_finder.py
+++ b/Lib/importlib/test/builtin/test_finder.py
@@ -1,4 +1,4 @@
-import importlib
+from importlib import machinery
from .. import support
import sys
@@ -12,7 +12,7 @@ class FinderTests(unittest.TestCase):
name = 'errno'
find_module = staticmethod(lambda name, path=None:
- importlib.BuiltinImporter().find_module(name, path))
+ machinery.BuiltinImporter.find_module(name, path))
def test_find_module(self):
diff --git a/Lib/importlib/test/builtin/test_loader.py b/Lib/importlib/test/builtin/test_loader.py
index 5aa3d79..87726c9 100644
--- a/Lib/importlib/test/builtin/test_loader.py
+++ b/Lib/importlib/test/builtin/test_loader.py
@@ -1,4 +1,5 @@
import importlib
+from importlib import machinery
from .. import support
import sys
@@ -23,7 +24,7 @@ class LoaderTests(unittest.TestCase):
self.assert_(module.__name__ in sys.modules)
load_module = staticmethod(lambda name:
- importlib.BuiltinImporter().load_module(name))
+ machinery.BuiltinImporter.load_module(name))
def test_load_module(self):
# Common case.
diff --git a/Lib/importlib/test/frozen/test_finder.py b/Lib/importlib/test/frozen/test_finder.py
index 2541019..8d8a8af 100644
--- a/Lib/importlib/test/frozen/test_finder.py
+++ b/Lib/importlib/test/frozen/test_finder.py
@@ -1,4 +1,4 @@
-import importlib
+from importlib import machinery
from ..builtin import test_finder
from .. import support
@@ -10,7 +10,7 @@ class FinderTests(test_finder.FinderTests):
"""Test finding frozen modules."""
def find(self, name, path=None):
- finder = importlib.FrozenImporter()
+ finder = machinery.FrozenImporter
return finder.find_module(name, path)
diff --git a/Lib/importlib/test/frozen/test_loader.py b/Lib/importlib/test/frozen/test_loader.py
index b37ae7f..95854f2 100644
--- a/Lib/importlib/test/frozen/test_loader.py
+++ b/Lib/importlib/test/frozen/test_loader.py
@@ -1,4 +1,4 @@
-import importlib
+from importlib import machinery
from ..builtin import test_loader
@@ -6,7 +6,7 @@ class LoaderTests(test_loader.LoaderTests):
name = '__phello__'
load_module = staticmethod(lambda name:
- importlib.FrozenImporter().load_module(name))
+ machinery.FrozenImporter.load_module(name))
verification = {'__name__': '__phello__', '__file__': '<frozen>',
'__package__': None, '__path__': ['__phello__']}