diff options
author | Brett Cannon <brett@python.org> | 2012-07-10 14:05:00 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2012-07-10 14:05:00 (GMT) |
commit | 461c8131648e26d14e4840d11c3cbd1da99cd04f (patch) | |
tree | 24b3f6c5970ff0697086ed71f2493602d8f0c5cf /Lib/importlib | |
parent | c4618e33b2ef1c6f1cb2d8d3c2e23dfcca9f5f44 (diff) | |
download | cpython-461c8131648e26d14e4840d11c3cbd1da99cd04f.zip cpython-461c8131648e26d14e4840d11c3cbd1da99cd04f.tar.gz cpython-461c8131648e26d14e4840d11c3cbd1da99cd04f.tar.bz2 |
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).
Diffstat (limited to 'Lib/importlib')
-rw-r--r-- | Lib/importlib/_bootstrap.py | 10 | ||||
-rw-r--r-- | Lib/importlib/test/import_/test_fromlist.py | 17 |
2 files changed, 7 insertions, 20 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 618dd26..dd214c4 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -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 diff --git a/Lib/importlib/test/import_/test_fromlist.py b/Lib/importlib/test/import_/test_fromlist.py index 4ff5f5e..281961d 100644 --- a/Lib/importlib/test/import_/test_fromlist.py +++ b/Lib/importlib/test/import_/test_fromlist.py @@ -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]): |