gpt4 book ai didi

python - importlib.reload 是否应该在 Python 3.6 中恢复已删除的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:39 25 4
gpt4 key购买 nike

我正在研究这两个相关问题:herehere

我在 Python 3.6 中看到了我不期望的行为,这与在 Python 2.7(和 3.4)中使用普通 reload 的行为不同。即,似乎在模块初始化期间或在重新加载期间重新执行模块时将填充的模块属性在使用 del 删除其本地名称后不会恢复...请参阅下面:

对于 Python 3.6:

In [1]: import importlib

In [2]: import math

In [3]: del math.cos

In [4]: math.cos
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-05b06e378197> in <module>()
----> 1 math.cos

AttributeError: module 'math' has no attribute 'cos'

In [5]: math = importlib.reload(math)

In [6]: math.cos
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-05b06e378197> in <module>()
----> 1 math.cos

AttributeError: module 'math' has no attribute 'cos'

In [7]: importlib.reload(math)
Out[7]: <module 'math' from '/home/ely/anaconda/envs/py36-keras/lib/python3.6/lib-dynload/math.cpython-36m-x86_64-linux-gnu.so'>

In [8]: math.cos
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-8-05b06e378197> in <module>()
----> 1 math.cos

AttributeError: module 'math' has no attribute 'cos'

对于 Python 2.7(和 Python 3.4):

In [1]: import math

In [2]: del math.cos

In [3]: math.cos
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-05b06e378197> in <module>()
----> 1 math.cos

AttributeError: 'module' object has no attribute 'cos'

In [4]: reload(math)
Out[4]: <module 'math' from '/home/ely/anaconda/lib/python2.7/lib-dynload/math.so'>

In [5]: math.cos
Out[5]: <function math.cos>

我已经尝试从 source codeC-level module exec function 追踪 importlib 的细节,但我看不到任何导致它无法将重新初始化的 cos 属性写回的逻辑模块范围全局变量的模块字典。

我怀疑这是 C 级重新执行逻辑中的某种类型的错误,该逻辑查看模块字典中找到的属性名称(以前导入时存在的那个,并且可能会变异为删除了一个属性,就像在我的示例中一样),然后当使用 exec 将模块的执行副作用写入该字典时,它会跳过键名(如 cos)不存在于模块的命名空间中,这与 Python 2.7 的行为不同。

最佳答案

我相信这是 PEP 489 的(有意的?无意的?)效果,扩展模块初始化的大修。 PEP 包括以下部分:

Module Reloading

Reloading an extension module using importlib.reload() will continue to have no effect, except re-settingimport-related attributes.

Due to limitations in shared library loading (both dlopen on POSIX andLoadModuleEx on Windows), it is not generally possible to load amodified library after it has changed on disk.

Use cases for reloading other than trying out a new version of themodule are too rare to require all module authors to keep reloading inmind. If reload-like functionality is needed, authors can export adedicated function for it.

code change在实现 PEP 489 的提交中引入了似乎对此行为负责的内容。

甚至 Python 3.4 也不支持真正从更改的文件中重新加载扩展模块;最接近的是 save a copy 的代码初始化后模块的字典和copy the contents重新加载时返回模块的实际字典。该代码 still exists , 但它不再被触发重新加载,我不知道它是否曾经打算被触发重新加载。我相信代码目前仅用于子解释器。

关于python - importlib.reload 是否应该在 Python 3.6 中恢复已删除的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48813320/

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