]> granicus.if.org Git - python/commitdiff
Issue #24029: Document the name binding behavior for submodule imports.
authorBarry Warsaw <barry@python.org>
Wed, 22 Apr 2015 22:29:16 +0000 (18:29 -0400)
committerBarry Warsaw <barry@python.org>
Wed, 22 Apr 2015 22:29:16 +0000 (18:29 -0400)
Doc/reference/import.rst
Misc/NEWS

index e9b7e53247d70fe5fa881e4b9b84b05f2b156fd3..7966bc5133370939af73fa95b1bfb34ccd9a08a1 100644 (file)
@@ -461,6 +461,41 @@ import machinery will create the new module itself.
       into :data:`sys.modules`, but it must remove **only** the failing
       module, and only if the loader itself has loaded it explicitly.
 
+Submodules
+----------
+
+When a submodule is loaded using any mechanism (e.g. ``importlib`` APIs, the
+``import`` or ``import-from`` statements, or built-in ``__import__()``) a
+binding is placed in the parent module's namespace to the submodule object.
+For example, if package ``spam`` has a submodule ``foo``, after importing
+``spam.foo``, ``spam`` will have an attribute ``foo`` which is bound to the
+submodule.  Let's say you have the following directory structure::
+
+    spam/
+        __init__.py
+        foo.py
+        bar.py
+
+and ``spam/__init__.py`` has the following lines in it::
+
+    from .foo import Foo
+    from .bar import Bar
+
+then executing the following puts a name binding to ``foo`` and ``bar`` in the
+``spam`` module::
+
+    >>> import spam
+    >>> spam.foo
+    <module 'spam.foo' from '/tmp/imports/spam/foo.py'>
+    >>> spam.bar
+    <module 'spam.bar' from '/tmp/imports/spam/bar.py'>
+
+Given Python's familiar name binding rules this might seem surprising, but
+it's actually a fundamental feature of the import system.  The invariant
+holding is that if you have ``sys.modules['spam']`` and
+``sys.modules['spam.foo']`` (as you would after the above import), the latter
+must appear as the ``foo`` attribute of the former.
+
 Module spec
 -----------
 
index fb2ced1c57a1d8b36a518150681a0532d7fde58e..24b515f1b2d0abc21177bbd6d83b609c26a26a53 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -220,6 +220,11 @@ C API
 
 - Issue #23998: PyImport_ReInitLock() now checks for lock allocation error
 
+Documentation
+-------------
+
+- Issue #24029: Document the name binding behavior for submodule imports.
+
 
 What's New in Python 3.4.3?
 ===========================