← Все вопросы

Что такое циклический импорт в Python и как его исправить?

Задан 4 месяца назад706 просмотров3 ответа
14

Разбил код на модули, и теперь при запуске вылетает ImportError: cannot import name '...'. Вроде модуль a импортирует из b, а b импортирует из a. Что это и как чинить?

3 ответа

25
✓ Принятый ответ — помог автору

Это циклический импорт: a импортирует b, а b в момент своей загрузки импортирует a, который ещё не догрузился до конца — отсюда cannot import name. Питон не успел определить имя, которое ты просишь.

Как чинят, по порядку предпочтения:

  1. Вынести общее в третий модуль. Если a и b обоим нужна, скажем, модель User — положи её в models.py и импортируй из него в оба. Цикл разрывается.
  2. Импорт внутри функции, а не на верхнем уровне. К моменту вызова функции модуль уже загружен:
def do():
    from b import helper  # импорт отложен до вызова
    return helper()
  1. Импортировать модуль целиком, а не имя: import b и обращаться b.helper (имя ищется в момент использования, а не импорта).

Чаще всего настоящая причина — плохое разделение ответственности: два модуля слишком сильно знают друг о друге. Перетасовка кода (пункт 1) — самое здоровое решение, остальное скорее заплатки.

9

Перенеси импорт внутрь функции, где он реально используется, а не в шапку файла. Часто этого достаточно, чтобы цикл разорвать.

-4

Просто убери один из импортов, он лишний.

Олег Зайцев Так нельзя советовать вслепую — если имя реально используется, код просто сломается. Надо разрывать цикл, а не выкидывать нужный импорт · 4 месяца назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект