mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
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).
This commit is contained in:
parent
c4618e33b2
commit
461c813164
4 changed files with 410 additions and 422 deletions
|
@ -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]):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue