奇怪的 Python __import__ 行为

Weird Python __import__ behavior

我已经在下面查看了很长一段时间,但无法弄清楚发生了什么。

我正在使用现有的 Python 项目,我的目录结构如下(简化):

.
├── functions
│   ├── __init__.py
│   └── test
│       ├── __init__.py
│       ├── file1.py
│       ├── file2.py
│       └── file3.py
├── myexec.py
└── mylib.py

我在 functions 模块的 __init__.py 文件中有以下代码(在函数中的其他代码中):

module_files = ['file1', 'file2', 'file3']
[__import__("functions.test." + module) for module in module_files]

奇怪的是,在接下来的几行中,使用了名称 test 而 Python 并没有抱怨,即使在任何地方都没有导入 test.

我在上面两行的前后添加了一些诊断信息,我看到 globals() 使用 test 模块更新。

请注意 test__init__.py 为空。

这里可能发生了什么? __import__ 行为是否有可能以某种方式改变并导致在导入 functions.test.fileX 时导入 test 名称?

导入系统加载functions.test.file1时,需要设置属性链,让表达式functions.test.file1不产生AttributeError。也就是说

__import__('functions.test.file1')

有副作用

functions.test = <the test module object>
functions.test.file1 = <the file1 module object>

由于 functions 包的 __init__.py 使用 functions 包的属性作为其全局变量,名称 test 的全局变量查找现在发现 functions.test .