我一直在寻找以下内容很长一段时间,却无法弄清楚发生了什么。
我正在使用现有的Python项目,我有一个类似于以下(简化)的目录结构:
.
├── functions
│ ├── __init__.py
│ └── test
│ ├── __init__.py
│ ├── file1.py
│ ├── file2.py
│ └── file3.py
├── myexec.py
└── mylib.py
我在__init__.py
模块的functions
文件中有以下代码(在函数中的其他代码中):
module_files = ['file1', 'file2', 'file3']
[__import__("functions.test." + module) for module in module_files]
奇怪的是,在以下几行中,使用名称test
并且Python不会抱怨它,即使没有任何导入test
。
我在上面两行之前和之后放了一些诊断消息,我看到globals()
模块更新了test
。
请注意__init__.py
的{{1}}为空。
这可能会发生什么?是否有可能以某种方式更改test
行为并导致在导入__import__
时导入test
名称?
答案 0 :(得分:1)
当导入系统加载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
。