[Python-checkins] peps: [PEP 451] Updates in response to the latest feedback.
eric.snow
python-checkins at python.org
Sun Oct 27 02:35:06 CEST 2013
http://hg.python.org/peps/rev/ead57cb56585
changeset: 5224:ead57cb56585
user: Eric Snow <ericsnowcurrently at gmail.com>
date: Sat Oct 26 18:30:41 2013 -0600
summary:
[PEP 451] Updates in response to the latest feedback.
This includes removing the remaining ModuleSpec methods and de-emphasizing
that find_spec() returns actual ModuleSpec instances.
files:
pep-0451.txt | 73 ++++++++++++++++++++-------------------
1 files changed, 37 insertions(+), 36 deletions(-)
diff --git a/pep-0451.txt b/pep-0451.txt
--- a/pep-0451.txt
+++ b/pep-0451.txt
@@ -240,8 +240,8 @@
importlib.machinery.ModuleSpec (new)
------------------------------------
-A specification for a module's import-system-related state. See the
-`ModuleSpec`_ section below for a more detailed description.
+An encapsulation of a module's import-system-related state during import.
+See the `ModuleSpec`_ section below for a more detailed description.
* ModuleSpec(name, loader, \*, origin=None, loader_state=None, is_package=None)
@@ -263,13 +263,6 @@
* has_location (RO-property) - a flag indicating whether or not the
module's "origin" attribute refers to a location.
-Instance Methods:
-
-* module_repr() - provide a repr string for the spec'ed module;
- non-locatable modules will use their origin (e.g. "built-in").
-* init_module_attrs(module) - set any of a module's import-related
- attributes that aren't already set.
-
importlib.util Additions
------------------------
@@ -289,6 +282,12 @@
importlib.find_loader() (which it replaces), but return a spec instead
of a loader.
+For finders:
+
+* importlib.abc.MetaPathFinder.find_spec(name, path) and
+ importlib.abc.PathEntryFinder.find_spec(name) will return a module
+ spec to use during import.
+
For loaders:
* importlib.abc.Loader.exec_module(module) will execute a module in its
@@ -443,34 +442,30 @@
How Loading Will Work
=====================
-Here is an outline of what ModuleSpec does during loading::
+Here is an outline of what the import machinery does during loading,
+adjusted to take advantage of the module's spec and the new loader API::
- def load(self):
- if not hasattr(self.loader, 'exec_module'):
- module = self.loader.load_module(self.name)
- self.init_module_attrs(module)
- return sys.modules[self.name]
+ module = None
+ if hasattr(spec.loader, 'create_module'):
+ module = spec.loader.create_module(spec)
+ if module is None:
+ module = ModuleType(spec.name)
+ # The import-related module attributes get set here:
+ _init_module_attrs(module)
- module = None
- if hasattr(self.loader, 'create_module'):
- module = self.loader.create_module(self)
- if module is None:
- module = ModuleType(self.name)
- self.init_module_attrs(module)
-
- sys.modules[self.name] = module
+ if not hasattr(spec.loader, 'exec_module'):
+ module = spec.loader.load_module(spec.name)
+ else:
+ sys.modules[spec.name] = module
try:
- self.loader.exec_module(module)
+ spec.loader.exec_module(module)
except BaseException:
try:
- del sys.modules[self.name]
+ del sys.modules[spec.name]
except KeyError:
pass
raise
- return sys.modules[self.name]
-
-Note: no "load" method is actually implemented as part of the public
-ModuleSpec API.
+ module_to_return = sys.modules[spec.name]
These steps are exactly what Loader.load_module() is already
expected to do. Loaders will thus be simplified since they will only
@@ -494,8 +489,8 @@
value of None indicates "not set". This contrasts with module
objects where the attribute simply doesn't exist. Most of the
attributes correspond to the import-related attributes of modules. Here
-is the mapping. The reverse of this mapping is used by
-ModuleSpec.init_module_attrs().
+is the mapping. The reverse of this mapping describes how the import
+machinery sets the module attributes right before calling exec_module().
========================== ==============
On ModuleSpec On Modules
@@ -523,7 +518,7 @@
"origin" is a string for the name of the place from which the module
originates. See `origin`_ above. Aside from the informational value,
-it is also used in module_repr(). In the case of a spec where
+it is also used in the module's repr. In the case of a spec where
"has_location" is true, ``__file__`` is set to the value of "origin".
For built-in modules "origin" would be set to "built-in".
@@ -655,7 +650,7 @@
finder or loader will likely be a better fit and should be tried first.
However, as long as a subclass still fulfills the requirements of the
import system, objects of that type are completely fine as the return
-value of Finder.find_spec().
+value of Finder.find_spec(). The same points apply to duck-typing.
Existing Types
@@ -695,7 +690,7 @@
**PathEntryFinder.find_spec(name)**
-Finders will return ModuleSpec objects when find_spec() is
+Finders must return ModuleSpec objects when find_spec() is
called. This new method replaces find_module() and
find_loader() (in the PathEntryFinder case). If a loader does
not have find_spec(), find_module() and find_loader() are
@@ -715,8 +710,9 @@
find_loader() to indicate it found part of a possible namespace
package. To achieve the same effect, find_spec() must return a spec
with "loader" set to None (a.k.a. not set) and with
-submodule_search_locations set to the same portions as were provided by
-find_loader(). It's up to PathFinder how to handle such specs.
+submodule_search_locations set to the same portions as would have been
+provided by find_loader(). It's up to PathFinder how to handle such
+specs.
Loaders
-------
@@ -777,6 +773,11 @@
* The various finders and loaders provided by importlib will be
updated to comply with this proposal.
+* Any other implmentations of or dependencies on the import-related APIs
+ (particularly finders and loaders) in the stdlib will be likewise
+ adjusted to this PEP. While they should continue to work, any such
+ changes that get missed should be considered bugs for the Python 3.4.x
+ series.
* The spec for the ``__main__`` module will reflect how the interpreter
was started. For instance, with ``-m`` the spec's name will be that
of the run module, while ``__main__.__name__`` will still be
--
Repository URL: http://hg.python.org/peps
More information about the Python-checkins
mailing list