mirror of https://github.com/python/cpython
Have importlib raise ImportError if None is found in sys.modules. This matches
current import semantics.
This commit is contained in:
parent
ccd686a473
commit
4d75fc1ce9
|
@ -864,7 +864,12 @@ def _gcd_import(name, package=None, level=0):
|
|||
name = package[:dot]
|
||||
with _ImportLockContext():
|
||||
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:
|
||||
pass
|
||||
parent = name.rpartition('.')[0]
|
||||
|
|
|
@ -17,15 +17,25 @@ class UseCache(unittest.TestCase):
|
|||
loader returns) [from cache on return]. This also applies to imports of
|
||||
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 for fromlist].
|
||||
[from cache for fromlist]. But if sys.modules contains None then
|
||||
ImportError is raised [None in cache].
|
||||
|
||||
"""
|
||||
def test_using_cache(self):
|
||||
# [use cache]
|
||||
module_to_use = "some module found!"
|
||||
sys.modules['some_module'] = module_to_use
|
||||
module = import_util.import_('some_module')
|
||||
self.assertEqual(id(module_to_use), id(module))
|
||||
with util.uncache(module_to_use):
|
||||
sys.modules['some_module'] = module_to_use
|
||||
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):
|
||||
mock = util.mock_modules(*names)
|
||||
|
|
Loading…
Reference in New Issue