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 |