本文介绍了重新加载';的递归版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我开发Python代码时,我通常在解释器中以一种特殊的方式测试它。我将import some_module
测试它,找到错误,修复错误并保存,然后使用内置的reload(some_module)
函数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)
的操作),或者,如果我更改了一大堆依赖项并且忘记了需要重新加载什么,则需要重新启动整个解释器。更方便的是,如果有一些recursive_reload
函数,我可以只执行recursive_reload(some_module)
,让Python不仅重新加载some_module
,而且递归地重新加载some_module
导入的每个模块(以及每个模块导入的每个模块,等等),这样我就可以确保我没有使用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
。
这篇关于重新加载';的递归版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!