bpo-29851: Have importlib.reload() raise ImportError if the module's spec is not found (GH-972)

This commit is contained in:
Garvit Khatri 2017-05-25 03:49:50 +05:30 committed by Brett Cannon
parent 3480ef9dd3
commit 94987826e8
5 changed files with 21 additions and 2 deletions

View file

@ -203,6 +203,9 @@ Functions
classes. classes.
.. versionadded:: 3.4 .. versionadded:: 3.4
.. versionchanged:: 3.7
:exc:`ModuleNotFoundError` is raised when the module being reloaded lacks
a :class:`ModuleSpec`.
:mod:`importlib.abc` -- Abstract base classes related to import :mod:`importlib.abc` -- Abstract base classes related to import

View file

@ -164,6 +164,8 @@ def reload(module):
pkgpath = None pkgpath = None
target = module target = module
spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) 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) _bootstrap._exec(spec, module)
# The module may have replaced itself in sys.modules! # The module may have replaced itself in sys.modules!
return sys.modules[name] return sys.modules[name]

View file

@ -197,8 +197,6 @@ class FindLoaderPEP302Tests(FindLoaderTests):
class ReloadTests: class ReloadTests:
"""Test module reloading for builtin and extension modules."""
def test_reload_modules(self): def test_reload_modules(self):
for mod in ('tokenize', 'time', 'marshal'): for mod in ('tokenize', 'time', 'marshal'):
with self.subTest(module=mod): with self.subTest(module=mod):
@ -361,6 +359,18 @@ class ReloadTests:
reloaded = self.init.reload(ham) reloaded = self.init.reload(ham)
self.assertIs(reloaded, 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, (Frozen_ReloadTests,
Source_ReloadTests Source_ReloadTests

View file

@ -774,6 +774,7 @@ Robert Kern
Jim Kerr Jim Kerr
Magnus Kessler Magnus Kessler
Lawrence Kesteloot Lawrence Kesteloot
Garvit Khatri
Vivek Khera Vivek Khera
Dhiru Kholia Dhiru Kholia
Akshit Khurana Akshit Khurana

View file

@ -604,6 +604,9 @@ Library
- bpo-10379: locale.format_string now supports the 'monetary' keyword argument, - bpo-10379: locale.format_string now supports the 'monetary' keyword argument,
and locale.format is deprecated. and locale.format is deprecated.
- bpo-29851: importlib.reload() now raises ModuleNotFoundError if the
module lacks a spec.
- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap,
improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi,
Manuel Krebber, and Łukasz Langa. Manuel Krebber, and Łukasz Langa.