奇怪的Python __import__行为

时间:2015-11-12 23:52:53

标签: python python-import

我一直在寻找以下内容很长一段时间,却无法弄清楚发生了什么。

我正在使用现有的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名称?

1 个答案:

答案 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