跟进有关重新加载模块的问题,如何从已更改的模块重新加载特定功能?
伪代码:
from foo import bar if foo.py has changed: reload bar
您想要的是可能的,但是需要重新加载两件事……首先reload(foo),但是您还必须这样做reload(baz)(假设baz是包含该from foo import bar语句的模块的名称)。
reload(foo)
reload(baz)
baz
from foo import bar
至于为什么…foo第一次加载时,将foo创建一个bar对象,其中包含一个对象。当您导入bar到baz模块,它存储到一个参考bar。当reload(foo)被调用时,foo对象被消隐,并且该模块重新执行。这意味着所有foo引用仍然有效,但是bar已经创建了一个新对象…因此,已导入到某处的所有引用仍然是对 旧 bar对象的引用。通过重新加载baz,使它重新导入新的bar。
foo
bar
或者,您可以只import foo在模块中执行操作,并始终调用foo.bar()。这样,无论何时reload(foo),您都将获得最新的bar参考。
import foo
foo.bar()
注意:从Python 3开始,首先需要通过导入reload函数 from importlib import reload
from importlib import reload