Что такое циклический импорт в Python и как его исправить?
Разбил код на модули, и теперь при запуске вылетает ImportError: cannot import name '...'. Вроде модуль a импортирует из b, а b импортирует из a. Что это и как чинить?
3 ответа
Это циклический импорт: a импортирует b, а b в момент своей загрузки импортирует a, который ещё не догрузился до конца — отсюда cannot import name. Питон не успел определить имя, которое ты просишь.
Как чинят, по порядку предпочтения:
- Вынести общее в третий модуль. Если
aиbобоим нужна, скажем, модельUser— положи её вmodels.pyи импортируй из него в оба. Цикл разрывается. - Импорт внутри функции, а не на верхнем уровне. К моменту вызова функции модуль уже загружен:
def do():
from b import helper # импорт отложен до вызова
return helper()
- Импортировать модуль целиком, а не имя:
import bи обращатьсяb.helper(имя ищется в момент использования, а не импорта).
Чаще всего настоящая причина — плохое разделение ответственности: два модуля слишком сильно знают друг о друге. Перетасовка кода (пункт 1) — самое здоровое решение, остальное скорее заплатки.
Перенеси импорт внутрь функции, где он реально используется, а не в шапку файла. Часто этого достаточно, чтобы цикл разорвать.
Просто убери один из импортов, он лишний.