我正在运行python 3.6.4
(anaconda,spyder)。
我是否需要重新加载用户定义的模块才能捕获更改?
例如,假设我编写了简单函数并将其保存在test.py
文件中:
def plus5(x):
return x + 5
然后在IPython
控制台中输入
import test as t
然后我将用户定义的函数更改为:
def plus5(x):
return x + 500
然后当我输入IPython
控制台
t.plus5(0) it returns 500 without re-import
或先重新加载模块。
如果我从" plus5"更改功能名称然后我必须重新导入模块以查看更改。但是当我更改函数语句时,它会自动捕获更改而无需重新导入模块
来自python文档:"注意出于效率原因,每个解释器会话只导入一个模块。因此,如果更改模块,则必须重新启动解释器 - 或者,如果只是一个模块要进行交互式测试,请使用importlib.reload()
,
e.g。 import importlib; importlib.reload(modulename)
"
答案 0 :(得分:2)
这是IPython解释器名称see here中的一项功能。它具有魔术命令%autoreload
,允许激活或停用此功能。它似乎默认开启,但我无法找到证明这一点的东西。
答案 1 :(得分:1)
正如Megalng所解释的,这是IPython
解释器的内置功能,在默认的Python
解释器中,您必须使用importlib
重新加载模块。这是默认的python解释器执行,
Python 3.6.2 (default, Sep 5 2017, 17:37:49)
[GCC 4.6.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> import test as t
>>> t.plus5(0)
5
>>>
>>>
>>> #Changed function body to return x + 500
...
>>> t.plus5(0)
5
>>> import test as t
>>> t.plus5(0)
5
>>> #It had no affect, even importing again doesn't work.
...
>>> import importlib; importlib.reload(t)
<module 'test' from '~/test.py'>
>>>
>>> t.plus5(0)
500
>>> #Now it works !
...
>>>
正如您所看到的,即使将函数体更改为return x + 500
,它仍会为t.plus5(0)
生成 5 的结果,甚至再次导入测试模块也无济于事。它仅在使用importlib重新加载测试模块时才开始工作。