Каков наилучший способ борьбы с циклом импорта в Python? - PullRequest
4 голосов
/ 16 июня 2011

В наших проектах у нас есть уровень 'control' со следующими модулями: 'grid', 'gridcell', 'combo' и т. Д. Модуль Grid импортирует модуль Gridcell, поскольку сетка состоит из ячеек, в то время как любая ячейка может содержать комбо внутри. , Итак, изначально мы начали использовать операторы from ... import ... внутри этих классов следующим образом:

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

Но это было нормально, пока мы не начали использовать сетку в качестве комбо-контента. Как только мы начали это делать, нам потребовалось добавить оператор 'from grid import grid' в 'combo.py'. После этого мы получаем исключение при импорте:

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

РЕДАКТИРОВАНИЕ:

Я также попытался «импортировать ... как ...» и получил следующую ошибку:

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

Я прочитал несколько статей, и все, что я нашел о том, как решить эту проблему, это использовать оператор import без from, например:

#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 ]

9 голосов
/ 16 июня 2011
import controls.gridcell as gridcell

и т.д.. и т. д. и т. д.

2 голосов
/ 16 июня 2011

Вы также можете переместить импорт в функции.

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

если у вас есть функция init(), это может быть удобно.

...