Browse Source

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

a submodule to a name are now supported.
pull/1526/head
Serhiy Storchaka 9 years ago
committed by GitHub
parent
commit
f93234bb8a
  1. 4
      Doc/whatsnew/3.7.rst
  2. 6
      Lib/test/test_import/__init__.py
  3. 1
      Lib/test/test_import/data/circular_imports/binding.py
  4. 1
      Lib/test/test_import/data/circular_imports/binding2.py
  5. 3
      Misc/NEWS
  6. 4
      Python/compile.c

4
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
===========

6
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.

1
Lib/test/test_import/data/circular_imports/binding.py

@ -0,0 +1 @@
import test.test_import.data.circular_imports.binding2 as binding2

1
Lib/test/test_import/data/circular_imports/binding2.py

@ -0,0 +1 @@
import test.test_import.data.circular_imports.binding as binding

3
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.

4
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;
}

Loading…
Cancel
Save