Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python `importlib.reload`不替换模块中的对象';s`uÈdict__`_Python_Python Importlib - Fatal编程技术网

Python `importlib.reload`不替换模块中的对象';s`uÈdict__`

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的状态。我希望它会再次成为一个模块,但

在python3.7-buster docker容器上运行python3.7.9

这是我的问题的一个基本例子

首先,我导入
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。解码器未重新分配



通常,您不应该期望重新加载模块会使其处于任何正常或有用的状态。模块重新加载有很多奇怪而微妙的问题,比如创建“邪恶孪生”类,不使用
中更新从模块导入的任何内容,不能很好地使用扩展模块等等。

不要依赖
重新加载
。模块重新加载是一团乱,有着根本的、根本无法解决的问题。这远远不是你会遇到的唯一问题。谢谢,这现在是有道理的。