Commit f93234bb authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub

bpo-30024: Circular imports involving absolute imports with binding (#1264)

a submodule to a name are now supported.
parent dbdea629
...@@ -85,6 +85,10 @@ Other Language Changes ...@@ -85,6 +85,10 @@ Other Language Changes
* :exc:`ImportError` now displays module name and module ``__file__`` path when * :exc:`ImportError` now displays module name and module ``__file__`` path when
``from ... import ...`` fails. (Contributed by Matthias Bussonnier in :issue:`29546`.) ``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 New Modules
=========== ===========
......
...@@ -1168,6 +1168,12 @@ class CircularImportTests(unittest.TestCase): ...@@ -1168,6 +1168,12 @@ class CircularImportTests(unittest.TestCase):
from test.test_import.data.circular_imports.subpkg import util from test.test_import.data.circular_imports.subpkg import util
self.assertIs(util.util, rebinding.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__': if __name__ == '__main__':
# Test needs to be a package, so we can do relative imports. # Test needs to be a package, so we can do relative imports.
......
import test.test_import.data.circular_imports.binding2 as binding2
import test.test_import.data.circular_imports.binding as binding
...@@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1?
Core and Builtins 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 - bpo-12414: sys.getsizeof() on a code object now returns the sizes
which includes the code struct and sizes of objects which it references. which includes the code struct and sizes of objects which it references.
Patch by Dong-hee Na. Patch by Dong-hee Na.
......
...@@ -2546,7 +2546,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname) ...@@ -2546,7 +2546,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
merely needs to bind the result to a name. merely needs to bind the result to a name.
If there is a dot in name, we need to split it and emit a 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, Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
PyUnicode_GET_LENGTH(name), 1); PyUnicode_GET_LENGTH(name), 1);
...@@ -2566,7 +2566,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname) ...@@ -2566,7 +2566,7 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
PyUnicode_GET_LENGTH(name)); PyUnicode_GET_LENGTH(name));
if (!attr) if (!attr)
return 0; return 0;
ADDOP_O(c, LOAD_ATTR, attr, names); ADDOP_O(c, IMPORT_FROM, attr, names);
Py_DECREF(attr); Py_DECREF(attr);
pos = dot + 1; pos = dot + 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment