gpt4 book ai didi

Python reload() 不重新加载类实现?

转载 作者:行者123 更新时间:2023-11-28 22:30:45 25 4
gpt4 key购买 nike

我的模块结构如下:

.
└── testmodule
├── __init__.py
└── submodule
├── __init__.py
└── implementation.py

2 directories, 3 files

这是每个文件的内容

# testmodule/__init__.py
import submodule
# testmodule/submodule/__init__.py
from implementation import *
# testmodule/submodule/implementation.py
class Car(object):
def __init__(self):
self.doors = 2
self.color = 'red'

当我在下面的测试中使用 reload() 时,为什么类实现没有“重新加载”?

Python 2.7.12 (default, Oct 11 2016, 05:24:00)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import testmodule
>>> car = testmodule.submodule.Car()
>>> car.doors
2
>>> # I edit the file and change self.doors = 2 to self.doors = 4
>>> reload(testmodule)
<module 'testmodule' from 'testmodule/__init__.pyc'>
>>> car = testmodule.submodule.Car()
>>> car.doors
2
>>> # no more edits made before the Python REPL is restarted

me@laptop # python
Python 2.7.12 (default, Oct 11 2016, 05:24:00)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import testmodule
>>> car = testmodule.submodule.Car()
>>> car.doors
4

更新

按照@wim 的逻辑,我必须重新加载 testmodule.submodule.implementation,然后重新加载 testmodule.submodule 才能使这个“工作”,而这确实是案件。查看这些测试:

Python 2.7.12 (default, Oct 11 2016, 05:24:00)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import testmodule
>>> c = testmodule.submodule.Car()
>>> c.doors
2
>>> # I edit the file and change self.doors = 2 to self.doors = 4
>>> reload(testmodule.submodule.implementation)
<module 'testmodule.submodule.implementation' from 'testmodule/submodule/implementation.py'>
>>> c = testmodule.submodule.Car()
>>> c.doors
2
>>> reload(testmodule.submodule)
<module 'testmodule.submodule' from 'testmodule/submodule/__init__.pyc'>
>>> c = testmodule.submodule.Car()
>>> c.doors
4

me@laptop # python
Python 2.7.12 (default, Oct 11 2016, 05:24:00)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import testmodule
>>> c = testmodule.submodule.Car()
>>> c.doors
2
>>> # I edit the file and change self.doors = 2 to self.doors = 4
>>> reload(testmodule.submodule)
<module 'testmodule.submodule' from 'testmodule/submodule/__init__.pyc'>
>>> c = testmodule.submodule.Car()
>>> c.doors
2
>>> reload(testmodule.submodule.implementation)
<module 'testmodule.submodule.implementation' from 'testmodule/submodule/implementation.py'>
>>> c = testmodule.submodule.Car()
>>> c.doors
2
>>> reload(testmodule.submodule)
<module 'testmodule.submodule' from 'testmodule/submodule/__init__.pyc'>
>>> c = testmodule.submodule.Car()
>>> c.doors
4

最佳答案

TL;DR 这是重新加载的预期行为。

为什么会这样?

导入 testmodule实际上将子包加载到 sys.modules 中:

>>> import testmodule
>>> [m for m in sys.modules if m.startswith('testmodule')]
['testmodule.submodule', 'testmodule.submodule.implementation', 'testmodule']

现在,当您重新加载时 testmodule , 它将在 testmodule 的实现中拾取更改直接 - 即在 testmodule/__init__.py 中更改的任何行.

但是,您没有更改那里的任何行,并且 submodule名称 testmodule保留引用仍将指向旧的未更改的submodule .

基本上,元答案是您高估了“重新加载”对事物的智能程度。您可以实现一个 Hook 到子包中的深度重载,但很难正确执行,我建议您不要打扰。

你能做些什么?

IPython 在这方面做了一些尝试,如果你感兴趣的话:

# Python 2
import __builtin__
from IPython.lib import deepreload
__builtin__.reload = deepreload.reload

(有关详细信息,请参阅 IPython.lib.deepreload )。

关于Python reload() 不重新加载类实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988125/

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