Commit ef04210c authored by Brett Cannon's avatar Brett Cannon

Issue #15111: When a module was imported using a 'from import'

statement (e.g. ``from distutils import msvc9compiler``) that triggers
an ImportError of its own (e.g. the non-existence of winreg), let that
exception propagate instead of raising a generic ImportError for the
module being requested (e.g. msvc9compiler).
parent 75b0c78f
......@@ -1459,16 +1459,14 @@ def _handle_fromlist(module, fromlist, import_):
# The hell that is fromlist ...
# If a package was imported, try to import stuff from fromlist.
if hasattr(module, '__path__'):
if '*' in fromlist and hasattr(module, '__all__'):
if '*' in fromlist:
fromlist = list(fromlist)
fromlist.remove('*')
fromlist.extend(module.__all__)
if hasattr(module, '__all__'):
fromlist.extend(module.__all__)
for x in fromlist:
if not hasattr(module, x):
try:
import_('{}.{}'.format(module.__name__, x))
except ImportError:
pass
import_('{}.{}'.format(module.__name__, x))
return module
......
......@@ -39,11 +39,9 @@ class HandlingFromlist(unittest.TestCase):
[object case]. This is even true if the object does not exist [bad object].
If a package is being imported, then what is listed in fromlist may be
treated as a module to be imported [module]. But once again, even if
something in fromlist does not exist as a module, no error is thrown
[no module]. And this extends to what is contained in __all__ when '*' is
imported [using *]. And '*' does not need to be the only name in the
fromlist [using * with others].
treated as a module to be imported [module]. And this extends to what is
contained in __all__ when '*' is imported [using *]. And '*' does not need
to be the only name in the fromlist [using * with others].
"""
......@@ -71,15 +69,6 @@ class HandlingFromlist(unittest.TestCase):
self.assertTrue(hasattr(module, 'module'))
self.assertEqual(module.module.__name__, 'pkg.module')
def test_no_module_from_package(self):
# [no module]
with util.mock_modules('pkg.__init__') as importer:
with util.import_state(meta_path=[importer],
path_hooks=[imp.NullImporter]):
module = import_util.import_('pkg', fromlist='non_existent')
self.assertEqual(module.__name__, 'pkg')
self.assertTrue(not hasattr(module, 'non_existent'))
def test_empty_string(self):
with util.mock_modules('pkg.__init__', 'pkg.mod') as importer:
with util.import_state(meta_path=[importer]):
......
......@@ -10,6 +10,10 @@ What's New in Python 3.3.0 Beta 2?
Core and Builtins
-----------------
- Issue #15111: When a module imported using 'from import' has an ImportError
inside itself, don't mask that fact behind a generic ImportError for the
module itself.
- Issue #15293: Add GC support to the AST base node type.
- Issue #15291: Fix a memory leak where AST nodes where not properly
......
This diff is collapsed.
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