diff options
author | Brett Cannon <brett@python.org> | 2012-08-17 17:21:16 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2012-08-17 17:21:16 (GMT) |
commit | 7385adc84cf7bc47b6975ba51fbf1da7b0a33b46 (patch) | |
tree | 7b0918b655f0a1606607edfb05353954894b05f1 /Lib | |
parent | b391b24efe9d12e44e237064ea26be43d6a6e9a2 (diff) | |
download | cpython-7385adc84cf7bc47b6975ba51fbf1da7b0a33b46.zip cpython-7385adc84cf7bc47b6975ba51fbf1da7b0a33b46.tar.gz cpython-7385adc84cf7bc47b6975ba51fbf1da7b0a33b46.tar.bz2 |
Issue #15715: Ignore failed imports triggered by the use of fromlist.
When the fromlist argument is specified for __import__() and the
attribute doesn't already exist, an import is attempted. If that fails
(e.g. module doesn't exist), the ImportError will now be silenced (for
backwards-compatibility). This *does not* affect
``from ... import ...`` statements.
Thanks to Eric Snow for the patch and Simon Feltman for reporting the
regression.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/importlib/_bootstrap.py | 9 | ||||
-rw-r--r-- | Lib/test/test_import.py | 6 |
2 files changed, 13 insertions, 2 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 8ecc882..471b380 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1573,8 +1573,13 @@ def _handle_fromlist(module, fromlist, import_): fromlist.extend(module.__all__) for x in fromlist: if not hasattr(module, x): - _call_with_frames_removed(import_, - '{}.{}'.format(module.__name__, x)) + try: + _call_with_frames_removed(import_, + '{}.{}'.format(module.__name__, x)) + except ImportError: + # Backwards-compatibility dictates we ignore failed + # imports triggered by fromlist. + pass return module diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index 2e58199..7f2fad0 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -334,6 +334,12 @@ class ImportTests(unittest.TestCase): del sys.path[0] remove_files(TESTFN) + def test_bogus_fromlist(self): + try: + __import__('http', fromlist=['blah']) + except ImportError: + self.fail("fromlist must allow bogus names") + class PycRewritingTests(unittest.TestCase): # Test that the `co_filename` attribute on code objects always points |