小编典典

递归版本的“重新加载”

python

在开发Python代码时,通常会在解释器中以即席方式对其进行测试。我将对其进行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),或者,如果我更改了一大堆依赖项并丢失了需要重新加载的内容的信息,则需要重新启动整个解释器。

更为方便的是,如果有一些recursive_reload功能,并且我可以做,recursive_reload(some_module)并且让Python不仅重新加载some_module,还递归地重新加载每个some_module导入的模块(以及每个模块导入的每个模块,依此类推),以便我可以确定我没有使用任何其他some_module依赖于该模块的旧版本。

我认为Python内置的recursive_reload功能不像我在此描述的功能,但是有一种简单的方法可以将这些东西结合在一起吗?


阅读 208

收藏
2020-12-20

共1个答案

小编典典

我遇到了同样的问题,您启发了我去解决这个问题。

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启动即可。

2020-12-20