diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/importlib/__init__.py | 2 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_api.py | 14 |
2 files changed, 14 insertions, 2 deletions
diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index 86febff..cb37d24 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -164,6 +164,8 @@ def reload(module): pkgpath = None target = module spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) + if spec is None: + raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name) _bootstrap._exec(spec, module) # The module may have replaced itself in sys.modules! return sys.modules[name] diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py index b0a94aa..50dbfe1 100644 --- a/Lib/test/test_importlib/test_api.py +++ b/Lib/test/test_importlib/test_api.py @@ -197,8 +197,6 @@ class FindLoaderPEP302Tests(FindLoaderTests): class ReloadTests: - """Test module reloading for builtin and extension modules.""" - def test_reload_modules(self): for mod in ('tokenize', 'time', 'marshal'): with self.subTest(module=mod): @@ -361,6 +359,18 @@ class ReloadTests: reloaded = self.init.reload(ham) self.assertIs(reloaded, ham) + def test_module_missing_spec(self): + #Test that reload() throws ModuleNotFounderror when reloading + # a module who's missing a spec. (bpo-29851) + name = 'spam' + with test_util.uncache(name): + module = sys.modules[name] = types.ModuleType(name) + # Sanity check by attempting an import. + module = self.init.import_module(name) + self.assertIsNone(module.__spec__) + with self.assertRaises(ModuleNotFoundError): + self.init.reload(module) + (Frozen_ReloadTests, Source_ReloadTests |