首先让我确定一下工作场景。
main.py
module/file1.py
module/file2.py
main.py
import module.file1
print(module.file1)
模块/ file1.py
import module.file2
模块/ file2.py
import module.file1
运行python3 main.py
会给我以下内容,这很好。
<module 'module.file1' from '/project/module/file1.py'>
现在,如果我将 module / file2.py 更改为具有以下内容:
import module.file1 as testtt
我得到了这个新输出(错误):
Traceback (most recent call last):
File "main.py", line 1, in <module>
import module.file1
File "/project/module/file1.py", line 1, in <module>
import module.file2
File "/project/module/file2.py", line 2, in <module>
import module.file1 as testtt
AttributeError: module 'module' has no attribute 'file2'
我猜测python在导入模块时并不能完全评估导入的模块,只有当你在两个文件中的任何一个文件中立即使用它时,才会导致循环引用爆炸。
我想象如果我在函数中使用模块,我也不会得到错误,因为在实际调用函数时会对其进行评估,如下所示:
import module.file1
def test():
print(module.file1)
这里有什么建议?我应该努力删除循环引用吗?无论如何,它似乎都是代码味道(现有的代码库)。
答案 0 :(得分:2)
它是一个实现细节。 import
语句使用__import__
函数执行查找和导入模块的工作,然后将其返回的模块绑定到as testtt
变量。
执行import module.file1 as testtt
之类的嵌套导入时,__import__
将返回基本模块(“module”)。由于导入器仍需要将“file1”绑定到本地名称空间,因此必须在该对象上查找子模块名称“file1”。由于file1的导入仍在进行中,因此尚未绑定到“模块”模块。
它适用于import module.file1
情况,因为file1
未绑定到本地名称空间而且不需要查找。
在您的代码生命周期中,循环导入存在许多陷阱。祝你好运!
答案 1 :(得分:1)
&#34;进口&#34;是一个可执行语句,因此您可以在函数
中进行导入def test():
import module.file1
print(module.file1)