如何处理Python中的循环导入问题?

5 投票
2 回答
9424 浏览
提问于 2025-04-16 19:43

在我们的项目中,有一个叫做“控制”的层级,里面有几个模块,比如“网格”、“网格单元”、“组合”等等。网格模块需要引入网格单元模块,因为网格是由单元格组成的,而任何单元格里面都可以放一个组合。所以一开始我们在这些类里面使用“from ... import ...”的方式来引入模块,像这样:

#grid.py
from controls.gridcell import cell
#gridcell.py
from controls.combo import combo

这在我们使用网格的时候还没问题,但当我们开始把网格作为组合的内容时,就出现了问题。我们需要在“combo.py”文件里添加“from grid import grid”这行代码。结果就出现了一个导入异常:

from controls.gridcell import gridcell 
ImportError: Cannot import name gridcell 

更新:

我也试过用“import ... as ...”的方式,但也出现了以下错误:

import controls.gridcell as gridcell
AttributeError: 'module' object has no attribute 'gridcell'

我看了好几篇文章,发现解决这个问题的方法就是使用不带“from”的“import”语句,比如:

#grid.py
import controls.gridcell
#gridcell.py
import controls.combo
#combo.py
import controls.grid

但这样的话,我们就得用全名,比如“controls.gridcell.cell”、“controls.combo.combo”、“controls.grid.grid”等等。

所以我想问,有没有其他方法可以让我们用更短的名字,还是说这就是解决这个问题的唯一方法?

抱歉如果我漏掉了什么。

谢谢大家!

2 个回答

4

你也可以把导入的库放到函数里面。

def foo():
    from controls.gridcell import cell
    from controls.combo import combo

如果你有一个 init() 函数,这样做会很方便。

9
import controls.gridcell as gridcell

等等等等等等。

撰写回答