gpt4 book ai didi

python - 重新加载本地模块不起作用

转载 作者:行者123 更新时间:2023-12-01 01:48:11 25 4
gpt4 key购买 nike

首先,我知道这之前已经发布过,但是要么 A) 这些建议不起作用,要么 B) 建议从命名空间中手动删除该模块,然后像平常一样重新导入它。

我有以下模块结构

basedir/
pytools/
__init__.py
tools.py
setup.py
test.py

如果我在basedir中,导入pytools并创建一个testcls类的对象。该类的实际属性可以在 tools.py 中找到。 testcls 有一个名为 testfunc 的方法,它现在只打印出 AAA:

>>> import pytools
>>> test = pytools.testcls()
>>> test.testfunc()
AAA

假设我将 testfunc() 更改为现在打印出 BBB。我这样做,并保存文件。然后我重新加载模块并重试,它没有打印出 BBB:

>>> from importlib import reload
>>> reload(pytools)
>>> test = pytools.testcls()
>>> test.testfunc()
AAA

但是如果我执行完全相同的过程,但更改 test.py,将该文件作为模块导入,编辑其中的函数,然后重新加载它,它的行为符合预期:

>>> import test
>>> testvariable = test.testcls()
>>> testvariable.testfunc2()
AAA
# Change the function here
>>> from importlib import reload
>>> reload(test)
>>> testvariable = test.testcls()
>>> testvariable.testfunc2()
BBB

我真的不明白发生了什么事,这让我很恼火。这也花费了我很多时间,但我现在更恼火。

有什么想法吗?

版本:

Python:3.6.5

解释器:IPython,6.2.1

最佳答案

让我们更笼统地命名:

basedir/
testpackage/
__init__.py
testmodule.py
test.py

如果 testmodule.py 包含:

class TestClass:
def test_method(self):
print("AAA")

然后以下内容将按您的预期工作:

>>> from testpackage import testmodule
>>> obj = testmodule.TestClass()
>>> obj.test_method()
DDD
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testmodule)
>>> obj = testmodule.TestClass()
>>> obj.test_method()
EEE

但是,如果__init__.py有类似:

from .testmodule import TestClass

并且您尝试导入(并重新加载)而不是模块,会发生以下情况:

>>> import testpackage
>>> obj = testpackage.TestClass()
>>> obj.test_method()
EEE
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testpackage)
>>> obj = testpackage.TestClass()
>>> obj.test_method()
EEE

(不变)

请注意以下部分of the docs :

If a module imports objects from another module using from … import …, calling reload() for the other module does not redefine the objects imported from it — one way around this is to re-execute the from statement, another is to use import and qualified names (module.name) instead.

如果您要按顺序重新加载模块和包,它会再次按您的预期工作:

>>> import testpackage
>>> obj = testpackage.TestClass()
>>> obj.test_method()
HHH
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testpackage.testmodule)
>>> reload(testpackage)
>>> obj = testpackage.TestClass()
>>> obj.test_method()
III

但这看起来很愚蠢并且容易出错,只需使用第一个示例中的方法即可:

from testpackage import testmodule
...
reload(testmodule)
...

关于python - 重新加载本地模块不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51014960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com