这显然是你不应该做的事情,自然容易弄坏东西.在您try 的Python实现中,它碰巧以这种特殊的方式 destruct 了事情,但Python并不promise 会发生什么.我要说的大部分内容都是实施细节.
sys
模块无法像普通内置模块那样进行初始化,因为它负责如此多的核心功能.相反,在解释器启动时,Python会创建带有特殊函数_PySys_Create
的sys
模块.该功能负责(工作的一部分)正确设置sys
模块,包括sys.modules
属性:
if (PyDict_SetItemString(sysdict, "modules", modules) < 0) {
goto error;
}
当您执行del sys.modules['sys']
时,导入系统将失go sys
模块的跟踪.当您再次try 导入它时,Python会try 创建一个全新的sys
模块,它这样做就好像sys
是一个普通的内置模块一样.它会经历初始化普通内置模块的过程.此过程使新的sys
模块处于不一致、初始化不当的状态,因为sys
从未被设计为以这种方式初始化.
reloading sys
有is支持,尽管我相信开发团队正在考虑取消这种支持-用例非常模糊,而且我唯一能想到的是过时的.重新初始化的一部分最终会达到旨在重新加载sys
的code path,该sys
从原始初始化早期创建的副本sys
、right before sys.modules
is set中更新其__dict__
:
interp->sysdict_copy = PyDict_Copy(sysdict);
if (interp->sysdict_copy == NULL) {
goto error;
}
if (PyDict_SetItemString(sysdict, "modules", modules) < 0) {
goto error;
}
此副本在早期Python版本上的处理方式不同,因此存在与版本相关的行为差异.