summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2012-08-17 17:21:16 (GMT)
committerBrett Cannon <brett@python.org>2012-08-17 17:21:16 (GMT)
commit7385adc84cf7bc47b6975ba51fbf1da7b0a33b46 (patch)
tree7b0918b655f0a1606607edfb05353954894b05f1 /Lib
parentb391b24efe9d12e44e237064ea26be43d6a6e9a2 (diff)
downloadcpython-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.py9
-rw-r--r--Lib/test/test_import.py6
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