当前位置: 首页 > 面试题库 >

递归版本的“重新加载”

汪茂
2023-03-14
问题内容

在开发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功能不像我在此描述的功能,但是有一种简单的方法可以将这些东西结合在一起吗?


问题答案:

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

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



 类似资料:
  • 问题内容: 我有一个嵌套的字典对象,并且希望能够检索具有任意深度的键的值。我可以通过子类化做到这一点: 但是,我不需要子类化即可获得此行为。是否有一些内置方法具有相同或相似的行为?如果不是,是否有任何提供此行为的标准或外部模块? 我目前正在使用Python 2.7,尽管我也很好奇也听说过3.x解决方案。 问题答案: 一个非常常见的模式是使用空dict作为默认值: 如果您有多个键,则可以使用(请注意

  • 问题内容: 在Python 3.5中,添加了类型注释(请参见此处)。 有没有一种方法来定义递归类型注释,例如用于树状结构? 在上面,注释似乎无效。运行代码会导致以下错误: 问题答案: 您可以使用PEP 484中定义的正向引用 通常发生这种情况的情况是容器类的定义,其中定义的类出现在某些方法的签名中。例如,以下代码(简单的二进制树实现的开始)不起作用: 为了解决这个问题,我们写: 可以将字符串文字用

  • 我很难理解尾递归的概念,我想做一个斐波那契函数的尾递归版本,到目前为止,这是我想出的,但我不知道它是否正确,有人能帮我吗,任何帮助都将不胜感激 代码编译并输出正确的结果

  • 问题内容: 我正在编写一个服务器程序,该程序用于运行API的单元测试 (显示大量信息并提供Web访问以控制/监视整个事情)… 服务器在编译时 会 知道 该API,并以JAR的形式提供。 为了能够在 不同版本 的API的单元测试结果之间进行比较(而无需重新启动服务器),我希望能够卸载“当前”版本的API,并重新加载较新的版本(或较旧的版本) 。 我不想使用URLClassLoader并按名称调用每个

  • 我很难理解尾部递归的概念,我想为类似斐波那契函数a(n-3)a(n-2)制作一个尾部递归版本,到目前为止,这是我提出的,但我不知道这是否是一个正确的方法,有人能帮我吗,任何帮助都将不胜感激 代码输出正确的结果 但是当我实现尾部递归时,我的方法是分而治之的,但它不起作用,输出是错误的

  • 问题内容: 我在上面直接写了上面的内容,因此可能无法编译,但认为可以。 任何人都可以从存储的角度来简短地解释它的工作原理吗?它通过计算5 (5-1)开始,然后依次下降到4 (4-1)然后是3 *(3-1).....直到达到1,它将只返回1,对吗?抱歉,我太粗略了,我只想知道这是如何工作的 谢谢 但随着工作的进行,它将获得各个阶段的值 5 (5-1)4 (4-1)… … … 这些如何存储然后取回,或