Python 使用 "as" 时循环引用导入不起作用

Python circular reference importing doesn't work when using "as"

让我先确定一下工作场景。

main.py
module/file1.py
module/file2.py

main.py

import module.file1
print(module.file1)

module/file1.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"是一个可执行语句,所以你可以在函数内部做导入

def test():
    import module.file1
    print(module.file1)

它是一个实现细节。 import 语句使用 __import__ 函数来完成查找和导入模块的工作,然后将其返回的模块绑定到 as testtt 变量。

当像 import module.file1 as testtt 那样进行嵌套导入时,__import__ returns 基本模块 ("module")。由于导入器仍然需要将 "file1" 绑定到本地名称空间,因此它必须在该对象上查找子模块名称 "file1"。由于 file1 的导入仍在进行中,因此尚未绑定到 "module" 模块。

它适用于 import module.file1 情况,因为 file1 未绑定到本地命名空间并且不需要查找。

循环导入有很多陷阱,它们会困扰您整个代码的生命周期。祝你好运!