Python `importlib.reload`不替换模块中的对象';s`uÈdict__`
在python3.7-buster docker容器上运行python3.7.9 这是我的问题的一个基本例子 首先,我导入Python `importlib.reload`不替换模块中的对象';s`uÈdict__`,python,python-importlib,Python,Python Importlib,在python3.7-buster docker容器上运行python3.7.9 这是我的问题的一个基本例子 首先,我导入json模块,并验证它是否包含解码器模块作为属性: 导入json,导入lib >>>json.decoder 然后,我将该属性设置为“无”,并验证: >>>json.\uuuu dict\uuuu['decoder']=无 >>>json.decoder#None的repr为空 然后我尝试重新加载模块并重新检查json.decoder的状态。我希望它会再次成为一个模块,但
json
模块,并验证它是否包含解码器
模块作为属性:
导入json,导入lib
>>>json.decoder
然后,我将该属性设置为“无”,并验证:
>>>json.\uuuu dict\uuuu['decoder']=无
>>>json.decoder#None的repr为空
然后我尝试重新加载模块并重新检查json.decoder
的状态。我希望它会再次成为一个模块,但我发现:
导入lib.reload(json)
>>>json.decoder#None的repr为空
好的,我可以直接导入解码器吗?否,它只返回已加载模块的值。(这并非完全出乎意料。)
>>从json导入解码器作为新的\u解码器
>>>新解码器#None的repr为空
好的,我注意到importlib.reload()
返回一个模块。如果我将模块标识符设置为函数调用,会怎么样
json=importlib.reload(json)
>>>json.decoder#None的repr为空
下面是一段相关的片段:
执行reload()时:
Python模块的代码被重新编译,模块级代码被重新执行,定义了一组新的
通过重用最初使用的加载程序,将对象绑定到模块字典中的名称
加载模块。扩展模块的init函数不会再次调用。
...
模块命名空间中的名称将更新为指向任何新的或更改的对象
这似乎准确地描述了我所期望的行为,但不是我所遇到的。
这是怎么回事?重新执行
json
包的代码不会重新分配json.decoder
。在json
包的\uuuu init\uuuuuuuuuy.py
中没有任何东西可以做到这一点
json
包的\uuuu init\uuuuu.py
包含以下行:
from .decoder import JSONDecoder, JSONDecodeError
第一次运行此行时(在第一次导入json
时),json.decoder
子模块被初始化,作为初始化的一部分,对该子模块的引用被设置为json
模块对象的decoder
属性
重新加载json
时,此行将重新执行,但json.decoder
子模块已初始化,无需再次初始化<代码>json。解码器未重新分配
通常,您不应该期望重新加载模块会使其处于任何正常或有用的状态。模块重新加载有很多奇怪而微妙的问题,比如创建“邪恶孪生”类,不使用
从
中更新从模块导入的任何内容,不能很好地使用扩展模块等等。不要依赖重新加载
。模块重新加载是一团乱,有着根本的、根本无法解决的问题。这远远不是你会遇到的唯一问题。谢谢,这现在是有道理的。