本文介绍了重新加载'的递归版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我开发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

这篇关于重新加载'的递归版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 17:31