【问题标题】:reimporting a single function in python在python中重新导入单个函数
【发布时间】:2010-12-08 09:20:17
【问题描述】:

在交互模式下使用 python 可以导入一个模块,然后如果模块被更改(错误修复或其他什么),可以简单地使用 reload() 命令。

但是如果我没有导入整个模块并使用'from M import f,g'导入语句会怎样。有什么办法只重新导入 g 吗?

(我尝试通过'del g'从参数表中删除函数并从目录中删除.pyc文件。它没有帮助。当我重新导入函数'from M import g'时,旧的g被加载)。

【问题讨论】:

  • 只需重启解释器;)

标签: python function import


【解决方案1】:

当您执行from foo import bar 时,您正在导入整个模块。您只是在当前命名空间中复制符号 bar。您不只导入函数。

reload 函数并不完全可靠(例如,它不适用于已编译的 C 模块)。我建议您退出并重新启动您的解释器。

【讨论】:

  • +1 用于明确导入模块与在命名空间中合并符号。
  • 这在 python 2.7.3 上不能以简单的方式工作 - 当我 from foo import bar 时,符号 foo 没有被定义。该模块确实在sys.modules中有一个条目,所以我可以成功reload(sys.modules['foo'])(当然是在import sys之后)。
【解决方案2】:

对于from M import f, g 其中M 不是官方python 模块,请使用:

import sys
import importlib
importlib.reload(sys.modules['M'])

然后,使用以下命令重新导入 f 和 g:

from M import f,g

如果M是官方python模块,使用

import importlib
importlib.reload(M)
from M import f,g

【讨论】:

    【解决方案3】:

    由于这只是针对交互式解释器,我不认为是这样的:

    def my_reload(mod, name):
        reload(mod)
        globals()[name] = getattr(mod, name)
    
    myreload(somemodule, "some_function")
    

    会很糟糕。这只是像正常一样重新加载模块,然后将指向旧对象的名称重新绑定到新对象。这应该适用于 reload 开始工作的所有情况。或者,您可以对其进行编程以获取实际对象并使用其__name__ 属性获取名称。函数、类和模块都有一个__name__ 属性,但是像模块级字典这样的东西没有,所以它不会那么灵活。

    它不会替换对除全局对象之外存在的对象的引用,但reload 也不会替换,即使您最初使用虚线名称访问它也是如此。一旦对对象的引用松散,您就无能为力了。

    【讨论】:

      【解决方案4】:

      对于第一次导入,将导入的片段绑定到一个变量(这也加快了查找速度):

      import numpy as NP
      import numpy.linalg as LA
        ...
      reload(LA)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-20
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 2019-01-24
        • 1970-01-01
        • 2015-10-27
        • 2016-11-27
        相关资源
        最近更新 更多