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
 |