#11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.

This commit is contained in:
Ezio Melotti 2011-05-09 06:41:55 +03:00
parent 0ed8c6897c
commit 199e0857f9

View File

@ -80,12 +80,14 @@ def import_module(name, deprecated=False):
def _save_and_remove_module(name, orig_modules):
"""Helper function to save and remove a module from sys.modules
Return value is True if the module was in sys.modules and
False otherwise."""
Return True if the module was in sys.modules, False otherwise.
Raise ImportError if the module can't be imported."""
saved = True
try:
orig_modules[name] = sys.modules[name]
except KeyError:
# try to import the module and raise an error if it can't be imported
__import__(name)
saved = False
else:
del sys.modules[name]
@ -95,8 +97,7 @@ def _save_and_remove_module(name, orig_modules):
def _save_and_block_module(name, orig_modules):
"""Helper function to save and block a module in sys.modules
Return value is True if the module was in sys.modules and
False otherwise."""
Return True if the module was in sys.modules, False otherwise."""
saved = True
try:
orig_modules[name] = sys.modules[name]
@ -112,6 +113,7 @@ def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
the sys.modules cache is restored to its original state.
Modules named in fresh are also imported anew if needed by the import.
If one of these modules can't be imported, None is returned.
Importing of modules named in blocked is prevented while the fresh import
takes place.
@ -133,6 +135,8 @@ def import_fresh_module(name, fresh=(), blocked=(), deprecated=False):
if not _save_and_block_module(blocked_name, orig_modules):
names_to_remove.append(blocked_name)
fresh_module = importlib.import_module(name)
except ImportError:
fresh_module = None
finally:
for orig_name, module in orig_modules.items():
sys.modules[orig_name] = module