diff options
author | Brett Cannon <brett@python.org> | 2013-05-28 22:35:54 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2013-05-28 22:35:54 (GMT) |
commit | 3dc48d6f6937f110388efd0f257fa12c323763a6 (patch) | |
tree | 58de10b0ae6755796ce557ea2f11941a3de02073 /Lib | |
parent | a22faca7144bdba5269e309965d926d155fc667b (diff) | |
download | cpython-3dc48d6f6937f110388efd0f257fa12c323763a6.zip cpython-3dc48d6f6937f110388efd0f257fa12c323763a6.tar.gz cpython-3dc48d6f6937f110388efd0f257fa12c323763a6.tar.bz2 |
Issue #18070: importlib.util.module_for_loader() now sets __loader__
and __package__ unconditionally in order to do the right thing for
reloading.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/importlib/_bootstrap.py | 35 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_util.py | 13 |
2 files changed, 15 insertions, 33 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index a4eab47..739279f 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -37,23 +37,13 @@ def _make_relax_case(): return _relax_case -# TODO: Expose from marshal def _w_long(x): - """Convert a 32-bit integer to little-endian. - - XXX Temporary until marshal's long functions are exposed. - - """ + """Convert a 32-bit integer to little-endian.""" return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') -# TODO: Expose from marshal def _r_long(int_bytes): - """Convert 4 bytes in little-endian to an integer. - - XXX Temporary until marshal's long function are exposed. - - """ + """Convert 4 bytes in little-endian to an integer.""" return int.from_bytes(int_bytes, 'little') @@ -569,17 +559,7 @@ def module_for_loader(fxn): """ def module_for_loader_wrapper(self, fullname, *args, **kwargs): - module = sys.modules.get(fullname) - is_reload = module is not None - if not is_reload: - # This must be done before open() is called as the 'io' module - # implicitly imports 'locale' and would otherwise trigger an - # infinite loop. - module = new_module(fullname) - # This must be done before putting the module in sys.modules - # (otherwise an optimization shortcut in import.c becomes wrong) - module.__initializing__ = True - sys.modules[fullname] = module + with ModuleManager(fullname) as module: module.__loader__ = self try: is_package = self.is_package(fullname) @@ -590,17 +570,8 @@ def module_for_loader(fxn): module.__package__ = fullname else: module.__package__ = fullname.rpartition('.')[0] - else: - module.__initializing__ = True - try: # If __package__ was not set above, __import__() will do it later. return fxn(self, module, *args, **kwargs) - except: - if not is_reload: - del sys.modules[fullname] - raise - finally: - module.__initializing__ = False _wrap(module_for_loader_wrapper, fxn) return module_for_loader_wrapper diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index b986efd..b3896f8 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -85,12 +85,23 @@ class ModuleForLoaderTests(unittest.TestCase): def test_reload(self): # Test that a module is reused if already in sys.modules. + class FakeLoader: + def is_package(self, name): + return True + @util.module_for_loader + def load_module(self, module): + return module name = 'a.b.c' module = imp.new_module('a.b.c') + module.__loader__ = 42 + module.__package__ = 42 with test_util.uncache(name): sys.modules[name] = module - returned_module = self.return_module(name) + loader = FakeLoader() + returned_module = loader.load_module(name) self.assertIs(returned_module, sys.modules[name]) + self.assertEqual(module.__loader__, loader) + self.assertEqual(module.__package__, name) def test_new_module_failure(self): # Test that a module is removed from sys.modules if added but an |