考虑以下情况:
script.py:
import sys
import cant_import_this
print(cant_import_this)
print(cant_import_this is sys)
cant_import_this.py:
import sys
sys.modules['cant_import_this'] = sys
令人惊讶的是script.py
的输出:
<module 'sys' (built-in)>
True
似乎正在发生的事情是:
import cant_import_this
检查cant_import_this
sys.modules
在cant_import_this
中找不到sys.modules
,因此找到并加载了cant_import_this.py
cant_import_this
模块已放入sys.modules
cant_import_this
中移除sys.modules
并将其替换为sys
sys.modules['cant_import_this']
的结果这种解释是否正确?更重要的是,这种行为是否记录在任何地方?它可能被视为一个错误吗?
答案 0 :(得分:1)
我在a footnote找到了答案:
importlib实现避免直接使用返回值。 相反,它通过查找模块名称来获取模块对象 sys.modules中。这种间接影响是导入的模块 可以在sys.modules中替换自己。这是特定于实现的 不能保证在其他Python中工作的行为 的实施方式。
所以这不是一个错误,但也不能依赖它。