在开发Python代码时,通常会在解释器中以即席方式对其进行测试。我将对其进行import some_module测试,找到一个错误,修复该错误并保存,然后使用内置reload函数进行reload(some_module)再次测试。
import some_module
reload
reload(some_module)
但是,假设some_module我有import some_other_module,并且在测试时some_module发现了一个错误some_other_module并进行了修复。现在调用reload(some_module)不会递归地重新导入some_other_module。我必须手动重新导入依赖项(通过执行类似reload(some_module.some_other_module),或的操作import some_other_module; reload(some_other_module),或者,如果我更改了一大堆依赖项并丢失了需要重新加载的内容的信息,则需要重新启动整个解释器。
some_module
import some_other_module
some_other_module
reload(some_module.some_other_module)
import some_other_module; reload(some_other_module)
更为方便的是,如果有一些recursive_reload功能,并且我可以做,recursive_reload(some_module)并且让Python不仅重新加载some_module,还递归地重新加载每个some_module导入的模块(以及每个模块导入的每个模块,依此类推),以便我可以确定我没有使用任何其他some_module依赖于该模块的旧版本。
recursive_reload
recursive_reload(some_module)
我认为Python内置的recursive_reload功能不像我在此描述的功能,但是有一种简单的方法可以将这些东西结合在一起吗?
我遇到了同样的问题,您启发了我去解决这个问题。
from types import ModuleType try: from importlib import reload # Python 3.4+ except ImportError: # Needed for Python 3.0-3.3; harmless in Python 2.7 where imp.reload is just an # alias for the builtin reload. from imp import reload def rreload(module): """Recursively reload modules.""" reload(module) for attribute_name in dir(module): attribute = getattr(module, attribute_name) if type(attribute) is ModuleType: rreload(attribute)
或者,如果您使用的是IPython,则只需使用dreload或传递--deep-reload启动即可。
dreload
--deep-reload