Commit 8319f386 authored by Eric Snow's avatar Eric Snow

issue #18698: ensure importlib.reload() returns the module out of sys.modules.

parent e45e9a70
...@@ -268,7 +268,9 @@ def reload(module): ...@@ -268,7 +268,9 @@ def reload(module):
if parent_name and parent_name not in sys.modules: if parent_name and parent_name not in sys.modules:
msg = "parent {!r} not in sys.modules" msg = "parent {!r} not in sys.modules"
raise ImportError(msg.format(parent_name), name=parent_name) raise ImportError(msg.format(parent_name), name=parent_name)
return module.__loader__.load_module(name) module.__loader__.load_module(name)
# The module may have replaced itself in sys.modules!
return sys.modules[module.__name__]
finally: finally:
try: try:
del _RELOADING[name] del _RELOADING[name]
......
...@@ -5,6 +5,7 @@ import os.path ...@@ -5,6 +5,7 @@ import os.path
import shutil import shutil
import sys import sys
from test import support from test import support
from test.test_importlib import util
import unittest import unittest
import warnings import warnings
...@@ -285,6 +286,22 @@ class ReloadTests(unittest.TestCase): ...@@ -285,6 +286,22 @@ class ReloadTests(unittest.TestCase):
with self.assertRaisesRegex(ImportError, 'html'): with self.assertRaisesRegex(ImportError, 'html'):
imp.reload(parser) imp.reload(parser)
def test_module_replaced(self):
# see #18698
def code():
module = type(sys)('top_level')
module.spam = 3
sys.modules['top_level'] = module
mock = util.mock_modules('top_level',
module_code={'top_level': code})
with mock:
with util.import_state(meta_path=[mock]):
module = importlib.import_module('top_level')
reloaded = imp.reload(module)
actual = sys.modules['top_level']
self.assertEqual(actual.spam, 3)
self.assertEqual(reloaded.spam, 3)
class PEP3147Tests(unittest.TestCase): class PEP3147Tests(unittest.TestCase):
"""Tests of PEP 3147.""" """Tests of PEP 3147."""
......
...@@ -202,6 +202,8 @@ Library ...@@ -202,6 +202,8 @@ Library
- Issue #17269: Workaround for socket.getaddrinfo crash on MacOS X - Issue #17269: Workaround for socket.getaddrinfo crash on MacOS X
with port None or "0" and flags AI_NUMERICSERV. with port None or "0" and flags AI_NUMERICSERV.
- Issue #18698: Ensure imp.reload() returns the module out of sys.modules.
- Issue #18080: When building a C extension module on OS X, if the compiler - Issue #18080: When building a C extension module on OS X, if the compiler
is overriden with the CC environment variable, use the new compiler as is overriden with the CC environment variable, use the new compiler as
the default for linking if LDSHARED is not also overriden. This restores the default for linking if LDSHARED is not also overriden. This restores
......
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