Commit 4d75fc1c authored by Brett Cannon's avatar Brett Cannon

Have importlib raise ImportError if None is found in sys.modules. This matches

current import semantics.
parent ccd686a4
...@@ -864,7 +864,12 @@ def _gcd_import(name, package=None, level=0): ...@@ -864,7 +864,12 @@ def _gcd_import(name, package=None, level=0):
name = package[:dot] name = package[:dot]
with _ImportLockContext(): with _ImportLockContext():
try: try:
return sys.modules[name] module = sys.modules[name]
if module is None:
message = ("import of {} halted; "
"None in sys.modules".format(name))
raise ImportError(message)
return module
except KeyError: except KeyError:
pass pass
parent = name.rpartition('.')[0] parent = name.rpartition('.')[0]
......
...@@ -17,15 +17,25 @@ class UseCache(unittest.TestCase): ...@@ -17,15 +17,25 @@ class UseCache(unittest.TestCase):
loader returns) [from cache on return]. This also applies to imports of loader returns) [from cache on return]. This also applies to imports of
things contained within a package and thus get assigned as an attribute things contained within a package and thus get assigned as an attribute
[from cache to attribute] or pulled in thanks to a fromlist import [from cache to attribute] or pulled in thanks to a fromlist import
[from cache for fromlist]. [from cache for fromlist]. But if sys.modules contains None then
ImportError is raised [None in cache].
""" """
def test_using_cache(self): def test_using_cache(self):
# [use cache] # [use cache]
module_to_use = "some module found!" module_to_use = "some module found!"
sys.modules['some_module'] = module_to_use with util.uncache(module_to_use):
module = import_util.import_('some_module') sys.modules['some_module'] = module_to_use
self.assertEqual(id(module_to_use), id(module)) module = import_util.import_('some_module')
self.assertEqual(id(module_to_use), id(module))
def test_None_in_cache(self):
#[None in cache]
name = 'using_None'
with util.uncache(name):
sys.modules[name] = None
with self.assertRaises(ImportError):
import_util.import_(name)
def create_mock(self, *names, return_=None): def create_mock(self, *names, return_=None):
mock = util.mock_modules(*names) mock = util.mock_modules(*names)
......
...@@ -68,6 +68,8 @@ C-API ...@@ -68,6 +68,8 @@ C-API
Library Library
------- -------
- Have importlib raise ImportError if None is found in sys.modules.
- Issue #6054: Do not normalize stored pathnames in tarfile. - Issue #6054: Do not normalize stored pathnames in tarfile.
- Issue #6794: Fix Decimal.compare_total and Decimal.compare_total_mag: NaN - Issue #6794: Fix Decimal.compare_total and Decimal.compare_total_mag: NaN
......
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