]> granicus.if.org Git - python/commitdiff
bpo-30024: Circular imports involving absolute imports with binding (#1264)
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 9 May 2017 19:31:05 +0000 (22:31 +0300)
committerGitHub <noreply@github.com>
Tue, 9 May 2017 19:31:05 +0000 (22:31 +0300)
a submodule to a name are now supported.

Doc/whatsnew/3.7.rst
Lib/test/test_import/__init__.py
Lib/test/test_import/data/circular_imports/binding.py [new file with mode: 0644]
Lib/test/test_import/data/circular_imports/binding2.py [new file with mode: 0644]
Misc/NEWS
Python/compile.c

index b2dc995dced12251b58d0e619b41767535a881a3..3de8bc5c93dcee06b40afb470776165b02873546 100644 (file)
@@ -85,6 +85,10 @@ Other Language Changes
 * :exc:`ImportError` now displays module name and module ``__file__`` path when
   ``from ... import ...`` fails. (Contributed by Matthias Bussonnier in :issue:`29546`.)
 
+* Circular imports involving absolute imports with binding a submodule to
+  a name are now supported.
+  (Contributed by Serhiy Storchaka in :issue:`30024`.)
+
 
 New Modules
 ===========
index d4b44459292548e70b262a7d510f8f20ff35538f..be17d6b7743f61c157ec657fb569ce2509c9afc5 100644 (file)
@@ -1168,6 +1168,12 @@ class CircularImportTests(unittest.TestCase):
         from test.test_import.data.circular_imports.subpkg import util
         self.assertIs(util.util, rebinding.util)
 
+    def test_binding(self):
+        try:
+            import test.test_import.data.circular_imports.binding
+        except ImportError:
+            self.fail('circular import with binding a submodule to a name failed')
+
 
 if __name__ == '__main__':
     # Test needs to be a package, so we can do relative imports.
diff --git a/Lib/test/test_import/data/circular_imports/binding.py b/Lib/test/test_import/data/circular_imports/binding.py
new file mode 100644 (file)
index 0000000..1fbf929
--- /dev/null
@@ -0,0 +1 @@
+import test.test_import.data.circular_imports.binding2 as binding2
diff --git a/Lib/test/test_import/data/circular_imports/binding2.py b/Lib/test/test_import/data/circular_imports/binding2.py
new file mode 100644 (file)
index 0000000..3d66937
--- /dev/null
@@ -0,0 +1 @@
+import test.test_import.data.circular_imports.binding as binding
index b9348880b4fc3ea4d0b8b75d9d189d258915fd00..1828b01065528a2bcda495a8c5eab97f22c1094a 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1?
 Core and Builtins
 -----------------
 
+- bpo-30024: Circular imports involving absolute imports with binding
+  a submodule to a name are now supported.
+
 - bpo-12414: sys.getsizeof() on a code object now returns the sizes
   which includes the code struct and sizes of objects which it references.
   Patch by Dong-hee Na.
index b630863afc508410dc4435ba13c3875dc65bad58..dad7404a85f3f4f25a48142951d73b7320db4d39 100644 (file)
@@ -2546,7 +2546,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
        merely needs to bind the result to a name.
 
        If there is a dot in name, we need to split it and emit a
-       LOAD_ATTR for each name.
+       IMPORT_FROM for each name.
     */
     Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
                                         PyUnicode_GET_LENGTH(name), 1);
@@ -2566,7 +2566,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
                                        PyUnicode_GET_LENGTH(name));
             if (!attr)
                 return 0;
-            ADDOP_O(c, LOAD_ATTR, attr, names);
+            ADDOP_O(c, IMPORT_FROM, attr, names);
             Py_DECREF(attr);
             pos = dot + 1;
         }