Python:reload component Y imported with'from X import Y'?

2024-04-29 10:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,一旦我使用import X在解释器会话中导入了一个模块X,并且该模块在外部发生了更改,我就可以使用reload(X)重新加载该模块。然后,这些更改将在我的翻译会话中可用。

我想知道当我使用from X import Y从模块X导入组件Y时,这是否也可能。

语句reload Y不起作用,因为Y不是模块本身,而是模块内部的组件(在本例中是类)。

不离开解释器会话(或导入整个模块)就可以重新加载模块的各个组件吗?

编辑:

为了澄清,问题是从模块X导入类或函数Y,并在更改时重新加载,而不是从包X重新加载模块Y


Tags: 模块函数fromimport编辑组件语句解释器
3条回答

如果Y是一个模块(X是一个包)reload(Y)就没问题了——否则,你就会明白为什么好的Python风格的指南(比如我的雇主的指南)说,除了模块之外,永远不要导入任何东西,不管我怎么解释这不是个好主意。

回答

从我的测试中。有标记的答案表示简单的reload(X),但不起作用。

据我所知,正确答案是:

from importlib import reload # python 2.7 does not require this
import X
reload( X )
from X import Y

测试

我的测试如下(Python 2.6.5+bpython 0.9.5.2)

X.py公司:

def Y():
    print "Test 1"

布莱顿:

>>> from X import Y
>>> print Y()
Test 1
>>> # Edit X.py to say "Test 2"
>>> print Y()
Test 1
>>> reload( X )  # doesn't work because X not imported yet
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'X' is not defined
>>> import X
>>> print Y()
Test 1
>>> print X.Y()
Test 1
>>> reload( X ) # No effect on previous "from" statements
>>> print Y()
Test 1
>>> print X.Y() # first one that indicates refresh
Test 2
>>> from X import Y
>>> print Y()
Test 2 
>>> # Finally get what we were after

首先,如果可以避免的话,根本不应该使用reload。但我们假设您有自己的理由(即在空闲状态下进行调试)。

重新加载库不会将名称返回到模块的命名空间中。为此,只需重新分配变量:

f = open('zoo.py', 'w')
f.write("snakes = ['viper','anaconda']\n")
f.close()

from zoo import snakes
print snakes

f = open('zoo.py', 'w')
f.write("snakes = ['black-adder','boa constrictor']\n")
f.close()

import zoo
reload(zoo)
snakes = zoo.snakes # the variable 'snakes' is now reloaded

print snakes

你可以用其他的方法。您可以通过搜索本地名称空间,并重新分配所讨论模块中的任何内容来自动化该过程,但我认为我们已经够邪恶了。

相关问题 更多 >