【问题标题】:Reload component from module in Python3从 Python3 中的模块重新加载组件
【发布时间】:2016-03-31 03:14:16
【问题描述】:

这个问题类似于 [Python: reload component Y imported with 'from X import Y'? ]。但是,显然 reload 在 python 3 中不起作用。

我最初有

from vb2GP import vb_Estep

但是,由于一个错误,我修改了 vb_Estep。当我尝试使用 importlib.reload(vb_Estep) 重新加载时,出现错误:

  File "<ipython-input-61-72416bca3a93>", line 1, in <module>
    importlib.reload(vb_Estep)

  File "/Users/sachin/anaconda/lib/python3.5/importlib/__init__.py", line 139, in reload
    raise TypeError("reload() argument must be module")

TypeError: reload() argument must be module

我什至尝试了importlib(vb2GP.vb_Estep),但我得到了错误NameError: name 'vb2GP' is not defined,这是有道理的,因为我从来没有导入vb2GP。

所以问题是,如何在 Python3 中使用importlib 重新加载组件。

【问题讨论】:

  • 您是否修改了vb_Estep(如果它是可变的)或者您是否将名称重新绑定到某个新对象(如果它不可变,这将是“修改”它的唯一方法)?
  • 我只是重写了几行。我对 python 很陌生,所以不完全确定这是否回答了这个问题。

标签: python-3.x


【解决方案1】:

您使用的reload 函数仅适用于模块,不能直接适用于从模块导入的对象。要使用它,您需要先导入vb2GP,然后在模块对象上调用reload,然后从新版本的模块中提取重新加载的vb_Estep 值。

import importlib

import vb2GP                      # import the old version of the module
vb2GP = importlib.reload(vb2GP)   # reload it
vb_Estep = vb2GP.vb_Estep         # get a reference to the value in the reloaded module

但这实际上可能没有必要,具体取决于您“修改”当前vb_Estep 值的具体方式。如果您只是将名称重新绑定到一个新值,则可以重新导入旧名称,而无需执行任何 reloading(只需再次使用 from vb2GP import vb_Estep)。只有当您修改了值(例如通过更改其内容或属性而不重新绑定变量名本身)时才需要上面的reload 代码。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2016-03-26
    • 2016-10-17
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2012-10-19
    相关资源
    最近更新 更多