Python中的循环导入依赖
假设我有以下的文件夹结构:
a\
__init__.py
b\
__init__.py
c\
__init__.py
c_file.py
d\
__init__.py
d_file.py
在包的__init__.py
文件中,导入了
当
那么,怎么解决这个问题呢?
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就可以都依赖那个新包,而不是互相依赖,要么你就应该把它们合并成一个包。