我有一个Python模块测试,我想编辑测试并在解释器中运行测试中的一些函数。 Python会自动查看我在测试中编辑的函数的差异而不重新导入吗?这个行动的恰当词是什么?
编辑到目前为止没有提到任何内容,所以我会发布一些细节:
一个类在我的模块中,名为Test。所以我使用了from test import Test
语句。现在,当我尝试命令reload(test)
时,解释器告诉我重新加载是未定义的。如果我import imp
然后imp.reload(test)
,解释程序会告诉我test
未定义。这里出了什么问题?
答案 0 :(得分:3)
我怀疑你正在使用Python 3,并且所有的回答者都假设您正在使用Python 2.
在Python 3中,reload
已从builtins
移至imp
。
所以答案是:
imp.reload(test)
为了将来参考,如果您使用的是Python 3,它几乎总是值得一提,除非您知道它不相关的事实,因为许多老前辈(阅读:你想要回答的人)将假设2.7。
同时,回到你的主要问题:
重新导入/重新加载/重新定义的最佳做法是什么?
对于简单的情况,reload()
或imp.reload()
正是您想要的。 (对于 super - 简单的情况,复制和粘贴没有问题......)
但是,如果你有一些bar
类foo.Bar
,然后重新加载foo
,那么很容易让自己感到困惑。使用from foo import *
也不能很好地发挥作用,这对于交互式会话来说通常很方便。
如果你可以启动一个新的翻译会话并导入模块,那就更清洁了。如果您需要创建一堆对象来开始使用该模块,您可以暂时将它们作为全局变量添加到模块中,或者创建一个定义它们的包装器模块。一些IDE可以将所有这些包装起来,所以只需点击一些加速键序列就可以重新启动解释器并重新运行import
和所有设置内容。
答案 1 :(得分:2)
答案 2 :(得分:1)
假设有一个名为data.py
的模块包含:
def foo():pass
In [13]: import data
In [14]: dir(data)
Out[14]: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo']
现在向data.py添加另一个函数,而shell仍在运行:
def foo():pass def bar():pass
In [15]: import data
In [16]: dir(data) #new function bar is not fetched by the import
#coz it simply loads the data object already present in memory
Out[16]: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo']
使用imp.reload()
重新加载模块对象。
In [17]: import imp
In [18]: imp.reload(data)
Out[18]: <module 'data' from 'data.py'>
In [19]: dir(data)
Out[19]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'bar',
'foo'] # bar fetched
help()
上的 reload()
:
重新加载(模块) - &gt;模块
重新加载模块。该模块必须已成功导入 之前。
答案 3 :(得分:1)
嗯,首先,你应该不有一个名为test
的模块,因为Python已经在其标准库中有一个。
test
未定义,因为您导入了Test
,而不是test
。您还需要import test
。
但请注意,由于imp.reload()
的工作方式,重新加载test
不会更新Test
;仍将引用该类的旧副本。你也必须再次from test import Test
。
完整的事件序列:
>>> import imp
>>> import test
>>> from test import Test
>>> Test().whatever()
# edit your code
>>> imp.reload(test)
>>> from test import Test # or: Test = test.Test
>>> Test().whatever()
这个故事的寓意是reload
糟透了,你应该不惜一切代价避免它。如果您想在每次编辑库之后重新运行一堆代码,只需将该代码放在文件中并运行它。