【问题标题】:Is there any possible point to reloading a Python module immediately?是否有可能立即重新加载 Python 模块?
【发布时间】:2011-05-06 20:56:48
【问题描述】:

在导入这些模块后立即重新加载它们有什么可想象的点吗?这是我正在审查的代码,这让我想知道:

import time
import sys
import os
import string
import pp
import numpy
import nrrd
reload(nrrd)
import smooth as sm
reload(sm)
import TensorEval2C as tensPP
reload(tensPP)
import TrackFiber4C as trackPP
reload(trackPP)
import cmpV
reload(cmpV)
import vectors as vects
reload(vects)

编辑:我建议这可能会使创建 .pyc 文件的可能性更大,但有几个人指出这是第一次,每次都发生。

【问题讨论】:

  • 不,.pyc 文件在模块首次导入时已经创建。请打一下写这篇文章的人,要么是因为编写了无用的令人困惑的代码,要么是因为他没有用大量 cmets 解释他的怪异黑客行为。此外,这些是一些可怕的模块名称。
  • 我继承了这位程序员的相当一部分代码;当时他们对 python 还很陌生,所以我通常认为当我看到疯狂或非 Pythonic 的东西时,他们不知道 Python 是如何工作的——但我尽量小心地假设我总是知道得更好。变量名称通常非常短,并且有很多多余的换行符和不必要的 for i in range(len(list)): 循环。

标签: python import reload


【解决方案1】:

我注意到 standard 模块只是被导入:它是重新加载的其他模块。我希望编写此代码的人希望能够轻松地重新加载整个包(以便获得最新的编辑)。在放入所有这些多余的reload 调用后,程序员只需要编写

>>> reload(package)

在解释器中更新内容,而不必输入

>>> reload(package.nrrd)
>>> reload(package.sm)
>>> reload(package.tensPP)

等等。因此,请忽略您对编写此代码的程序员实施暴力的建议:他们是far from the only programmer,在重新加载依赖项时遇到了麻烦。只是鼓励他们将重新加载转移到一个方便的功能。

【讨论】:

  • 我正在运行一个嵌入式版本的 Python,它(出于调试目的)重新加载主模块,主模块重新加载所有其他模块,以确保它们都使用最新版本的代码。这意味着我可以调试代码而无需停止并重新启动整个应用程序。
  • 查看我为框架提供的链接,该框架自动在依赖项发生更改时重新加载它们。
  • 似乎是最可能的原因。
【解决方案2】:

这可能会导致某些事情发生;一个明显的例子是在导入时发生的副作用。例如,模块可以将每次导入的时间和日期记录到文件中。

但是,这可能没有充分的理由。

【讨论】:

    【解决方案3】:

    .pyc 文件将在第一次导入时创建,因此即使这样也不是一个很好的理由。

    【讨论】:

    • 我怀疑这有什么好的理由。我当然希望它有一些远程有效的理由。
    • 谢谢,更新了问题,以免延续这个神话。
    【解决方案4】:

    这段代码的执行环境是什么?至少有一个 Python Web 框架会做出与标准 Python 不同的重新加载决策,当您做出不“接受”的更改时,这会导致沮丧和困惑。

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 2012-05-20
      • 2023-02-07
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2011-08-27
      • 2011-09-10
      • 2018-10-20
      相关资源
      最近更新 更多