意外的导入行为:sys.modules被检查两次?

时间:2017-07-14 12:23:28

标签: python import python-import

考虑以下情况:

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

似乎正在发生的事情是:

  1. import cant_import_this检查cant_import_this
  2. 中是否存在sys.modulescant_import_this中找不到
  3. sys.modules,因此找到并加载了cant_import_this.py
  4. 未初始化的cant_import_this模块已放入sys.modules
  5. 执行该模块,从cant_import_this中移除sys.modules并将其替换为sys
  6. 而不是返回模块本身,返回查找sys.modules['cant_import_this']的结果
  7. 这种解释是否正确?更重要的是,这种行为是否记录在任何地方?它可能被视为一个错误吗?

1 个答案:

答案 0 :(得分:1)

我在a footnote找到了答案:

  

importlib实现避免直接使用返回值。   相反,它通过查找模块名称来获取模块对象   sys.modules中。这种间接影响是导入的模块   可以在sys.modules中替换自己。这是特定于实现的   不能保证在其他Python中工作的行为   的实施方式。

所以这不是一个错误,但也不能依赖它。