奇怪的 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
.
我已经在下面查看了很长一段时间,但无法弄清楚发生了什么。
我正在使用现有的 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
.