首先让我确定什么工作方案。
main.py
module/file1.py
module/file2.py
main.py
import module.file1
print(module.file1)
模块/文件1.py
import module.file2
module / 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)
这里有什么建议?我应该只是删除循环引用吗?无论如何,似乎代码都有气味(现有的代码库)。
其实现细节。该import
语句使用该__import__
函数完成查找和导入模块的工作,然后将其返回的模块绑定到as testtt
变量。
当执行类似的嵌套导入时import module.file1 as testtt
,__import__
返回基本模块(“模块”)。由于导入器仍然需要将“ file1”绑定到本地名称空间,因此它必须在该对象上查找子模块名称“ file1”。由于file1的导入仍在进行中,因此尚未将其绑定到“模块”模块。
在这种import module.file1
情况下可以工作,因为file1
它没有绑定到本地名称空间,也不需要查找。
循环导入有很多陷阱,它们会困扰您整个代码的生命周期。祝好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句