Python中的循环导入依赖

96 投票
7 回答
92163 浏览
提问于 2025-04-15 15:01

假设我有以下的文件夹结构:

a\
    __init__.py
    b\
        __init__.py
        c\
            __init__.py
            c_file.py
        d\
            __init__.py
            d_file.py

包的__init__.py文件中,导入了。但是又导入了

尝试导入时,程序出错,提示找不到这个b,因为在导入的过程中,b确实还不存在。

那么,怎么解决这个问题呢?

7 个回答

34

我曾经想过这个问题几次(通常是在处理需要相互了解的模型时)。简单的解决办法就是直接导入整个模块,然后引用你需要的部分。

所以,不用在一个文件里写

from models import Student

在另一个文件里写

from models import Classroom

而是直接在其中一个文件里写

import models

然后在需要的时候调用 models.Classroom

172

你可以推迟导入,比如在 a/__init__.py 文件里:

def my_function():
    from a.b.c import Blah
    return Blah()

也就是说,等到真正需要的时候再导入。不过,我建议你仔细检查一下你的包的定义和使用,因为像提到的这种循环依赖可能说明你的设计有问题。

67

如果a依赖于c,而c又依赖于a,那它们不就是同一个东西了吗?

你真的应该想想为什么要把a和c分成两个包。因为要么你有一些代码应该分出来放到另一个包里,这样a和c就可以都依赖那个新包,而不是互相依赖,要么你就应该把它们合并成一个包。

撰写回答