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/importlib | |
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/importlib')
-rw-r--r-- | Lib/importlib/_bootstrap.py | 35 |
1 files changed, 3 insertions, 32 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 |