diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index b2dc995dced..3de8bc5c93d 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -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 =========== diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index d4b44459292..be17d6b7743 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -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 index 00000000000..1fbf929abb9 --- /dev/null +++ b/Lib/test/test_import/data/circular_imports/binding.py @@ -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 index 00000000000..3d6693769d4 --- /dev/null +++ b/Lib/test/test_import/data/circular_imports/binding2.py @@ -0,0 +1 @@ +import test.test_import.data.circular_imports.binding as binding diff --git a/Misc/NEWS b/Misc/NEWS index b9348880b4f..1828b010655 100644 --- 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. diff --git a/Python/compile.c b/Python/compile.c index b630863afc5..dad7404a85f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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; }