45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
|
import importlib
|
||
|
import sys
|
||
|
import types
|
||
|
|
||
|
# This gets cleared if this package/the __init__ module is reloaded
|
||
|
_module_cache: dict[str, types.ModuleType] = {}
|
||
|
|
||
|
|
||
|
def enable_reload(module_name: str):
|
||
|
"""Enable reloading for the next time the module with `module_name`
|
||
|
is executed.
|
||
|
"""
|
||
|
mod = sys.modules[module_name]
|
||
|
setattr(mod, module_name.replace('.', '_') + "_DO_RELOAD_MODULE", True)
|
||
|
|
||
|
|
||
|
def is_reload(module_name: str) -> bool:
|
||
|
"""True if the module given by `module_name` should reload the
|
||
|
modules it imports. This is the case if `enable_reload()` was called
|
||
|
for the module before.
|
||
|
"""
|
||
|
mod = sys.modules[module_name]
|
||
|
return hasattr(mod, module_name.replace('.', '_') + "_DO_RELOAD_MODULE")
|
||
|
|
||
|
|
||
|
def reload_module(module: types.ModuleType) -> types.ModuleType:
|
||
|
"""Wrapper around importlib.reload() to make sure no module is
|
||
|
reloaded twice.
|
||
|
|
||
|
Make sure to call this function in the same order in which the
|
||
|
modules are imported to make sure that the reloading respects the
|
||
|
module dependencies. Otherwise modules could depend on other modules
|
||
|
that are not yet reloaded.
|
||
|
|
||
|
If you import classes or functions from a module, make sure to
|
||
|
re-import them after the module is reloaded.
|
||
|
"""
|
||
|
mod = _module_cache.get(module.__name__, None)
|
||
|
|
||
|
if mod is None:
|
||
|
mod = importlib.reload(module)
|
||
|
_module_cache[module.__name__] = mod
|
||
|
|
||
|
return mod
|