[Python-checkins] r70751 - python/branches/py3k/Doc/library/importlib.rst

guido.van.rossum python-checkins at python.org
Mon Mar 30 22:34:58 CEST 2009


Author: guido.van.rossum
Date: Mon Mar 30 22:34:57 2009
New Revision: 70751

Log:
Thorough review of importlib docs.  Reviewed by Brett himself.


Modified:
   python/branches/py3k/Doc/library/importlib.rst

Modified: python/branches/py3k/Doc/library/importlib.rst
==============================================================================
--- python/branches/py3k/Doc/library/importlib.rst	(original)
+++ python/branches/py3k/Doc/library/importlib.rst	Mon Mar 30 22:34:57 2009
@@ -37,7 +37,7 @@
 
     The :func:`.__import__` function
         The built-in function for which the :keyword:`import` statement is
-        syntactic sugar for.
+        syntactic sugar.
 
     :pep:`235`
         Import on Case-Insensitive Platforms
@@ -71,8 +71,8 @@
     Import a module. The *name* argument specifies what module to
     import in absolute or relative terms
     (e.g. either ``pkg.mod`` or ``..mod``). If the name is
-    specified in relative terms, then the *package* argument must be
-    set to the package which is to act as the anchor for resolving the
+    specified in relative terms, then the *package* argument must be set to
+    the name of the package which is to act as the anchor for resolving the
     package name (e.g. ``import_module('..mod', 'pkg.subpkg')`` will import
     ``pkg.mod``).
 
@@ -80,7 +80,11 @@
     :func:`__import__`. This means all semantics of the function are derived
     from :func:`__import__`, including requiring the package from which an
     import is occurring to have been previously imported (i.e., *package*
-    must already be imported).
+    must already be imported).  The most important difference is that
+    :func:`import_module` returns the most nested package or module that
+    was imported (e.g. ``pkg.mod``), while :func:`__import__` returns the
+    top-level package or module (e.g. ``pkg``).
+
 
 :mod:`importlib.abc` -- Abstract base classes related to import
 ---------------------------------------------------------------
@@ -96,21 +100,21 @@
 .. class:: Finder
 
     An abstract base class representing a :term:`finder`.
+    See :pep:`302` for the exact definition for a finder.
 
     .. method:: find_module(fullname, path=None)
 
         An abstract method for finding a :term:`loader` for the specified
         module. If the :term:`finder` is found on :data:`sys.meta_path` and the
-        module to be searched for is a subpackage or module then *path* is set
-        to the value of :attr:`__path__` from the parent package. If a loader
+        module to be searched for is a subpackage or module then *path* will
+        be the value of :attr:`__path__` from the parent package. If a loader
         cannot be found, :keyword:`None` is returned.
 
-        The exact definition of a :term:`finder` can be found in :pep:`302`.
-
 
 .. class:: Loader
 
     An abstract base class for a :term:`loader`.
+    See :pep:`302` for the exact definition for a loader.
 
     .. method:: load_module(fullname)
 
@@ -118,18 +122,19 @@
         loaded, :exc:`ImportError` is raised, otherwise the loaded module is
         returned.
 
-        If the requested module is already exists in :data:`sys.modules`, that
+        If the requested module already exists in :data:`sys.modules`, that
         module should be used and reloaded.
-        Otherwise a new module is to be created by the loader and inserted into
-        :data:`sys.modules` before any loading begins to prevent recursion from
-        the import. If the loader inserted into a module and the load fails it
+        Otherwise the loader should create a new module and insert it into
+        :data:`sys.modules` before any loading begins, to prevent recursion
+        from the import. If the loader inserted a module and the load fails, it
         must be removed by the loader from :data:`sys.modules`; modules already
         in :data:`sys.modules` before the loader began execution should be left
         alone. The :func:`importlib.util.module_for_loader` decorator handles
         all of these details.
 
-        The loader is expected to set several attributes on the module when
-        adding a new module to :data:`sys.modules`.
+        The loader should set several attributes on the module.
+        (Note that some of these attributes can change when a module is
+        reloaded.)
 
         - :attr:`__name__`
             The name of the module.
@@ -139,7 +144,7 @@
             modules).
 
         - :attr:`__path__`
-            Set to a list of strings specifying the search path within a
+            A list of strings specifying the search path within a
             package. This attribute is not set on modules.
 
         - :attr:`__package__`
@@ -149,9 +154,9 @@
             for :attr:`__package__`.
 
         - :attr:`__loader__`
-            Set to the loader used to load the module.
-
-        See :pep:`302` for the exact definition for a loader.
+            The loader used to load the module.
+            (This is not set by the built-in import machinery,
+            but it should be set whenever a :term:`loader` is used.)
 
 
 .. class:: ResourceLoader
@@ -163,17 +168,20 @@
     .. method:: get_data(path)
 
         An abstract method to return the bytes for the data located at *path*.
-        Loaders that have a file-like storage back-end can implement this
-        abstract method to give direct access
+        Loaders that have a file-like storage back-end
+        that allows storing arbitrary data (e.g. a zip archive loader)
+        can implement this abstract method to give direct access
         to the data stored. :exc:`IOError` is to be raised if the *path* cannot
         be found. The *path* is expected to be constructed using a module's
         :attr:`__path__` attribute or an item from :attr:`__path__`.
+.. XXX What's the difference between the latter two?  (Maybe one is __file__?)
+.. XXX Could use a clarification so as not to depend on PEP 302.
 
 
 .. class:: InspectLoader
 
     An abstract base class for a :term:`loader` which implements the optional
-    :pep:`302` protocol for loaders which inspect modules.
+    :pep:`302` protocol for loaders that inspect modules.
 
     .. method:: get_code(fullname)
 
@@ -185,7 +193,7 @@
     .. method:: get_source(fullname)
 
         An abstract method to return the source of a module. It is returned as
-        a string with universal newline support. Returns :keyword:`None` if no
+        a text string with universal newlines. Returns :keyword:`None` if no
         source is available (e.g. a built-in module). Raises :exc:`ImportError`
         if the loader cannot find the module specified.
 
@@ -224,14 +232,17 @@
 
         A concrete implementation of
         :meth:`importlib.abc.InspectLoader.get_code` that creates code objects
-        from Python source code.
+        from Python source code, by requesting the source code (using
+        :meth:`source_path` and :meth:`get_data`), converting it to standard
+        newlines, and compiling it with the built-in :func:`compile` function.
 
     .. method:: get_source(fullname)
 
         A concrete implementation of
         :meth:`importlib.abc.InspectLoader.get_source`. Uses
         :meth:`importlib.abc.InspectLoader.get_data` and :meth:`source_path` to
-        get the source code.
+        get the source code.  It tries to guess the source encoding using
+        :func:`tokenize.detect_encoding`.
 
 
 .. class:: PyPycLoader
@@ -250,8 +261,9 @@
     .. method:: bytecode_path(fullname)
 
         An abstract method which returns the path to the bytecode for the
-        specified module. :keyword:`None` is returned if there is no bytecode.
-        :exc:`ImportError` is raised if the module is not found.
+        specified module, if it exists. It returns :keyword:`None`
+        if no bytecode exists (yet).
+        Raises :exc:`ImportError` if the module is not found.
 
     .. method:: write_bytecode(fullname, bytecode)
 
@@ -259,6 +271,7 @@
         use. If the bytecode is written, return :keyword:`True`. Return
         :keyword:`False` if the bytecode could not be written. This method
         should not be called if :data:`sys.dont_write_bytecode` is true.
+        The *bytecode* argument should be a bytes string or bytes array.
 
 
 :mod:`importlib.machinery` -- Importers and path hooks
@@ -328,16 +341,18 @@
 
 .. function:: module_for_loader(method)
 
-    A :term:`decorator` for a :term:`loader` which handles selecting the proper
+    A :term:`decorator` for a :term:`loader` method,
+    to handle selecting the proper
     module object to load with. The decorated method is expected to have a call
     signature taking two positional arguments
     (e.g. ``load_module(self, module)``) for which the second argument
-    will be the module object to be used by the loader. Note that the decorator
+    will be the module **object** to be used by the loader.
+    Note that the decorator
     will not work on static methods because of the assumption of two
     arguments.
 
-    The decorated method will take in the name of the module to be loaded as
-    expected for a :term:`loader`. If the module is not found in
+    The decorated method will take in the **name** of the module to be loaded
+    as expected for a :term:`loader`. If the module is not found in
     :data:`sys.modules` then a new one is constructed with its
     :attr:`__name__` attribute set. Otherwise the module found in
     :data:`sys.modules` will be passed into the method. If an
@@ -346,18 +361,17 @@
     module from being in left in :data:`sys.modules`. If the module was already
     in :data:`sys.modules` then it is left alone.
 
-    Use of this decorator handles all the details of what module object a
+    Use of this decorator handles all the details of which module object a
     loader should initialize as specified by :pep:`302`.
 
-
 .. function:: set_loader(fxn)
 
-    A :term:`decorator` for a :term:`loader` to set the :attr:`__loader__`
+    A :term:`decorator` for a :term:`loader` method,
+    to set the :attr:`__loader__`
     attribute on loaded modules. If the attribute is already set the decorator
     does nothing. It is assumed that the first positional argument to the
     wrapped method is what :attr:`__loader__` should be set to.
 
-
 .. function:: set_package(fxn)
 
     A :term:`decorator` for a :term:`loader` to set the :attr:`__package__`
@@ -365,3 +379,5 @@
     set and has a value other than :keyword:`None` it will not be changed.
     Note that the module returned by the loader is what has the attribute
     set on and not the module found in :data:`sys.modules`.
+
+.. XXX This whole chapter desperately needs examples...


More information about the Python-checkins mailing list