Ответ
Циклический импорт (circular import) в Python — это ситуация, когда два или более модуля прямо или косвенно импортируют друг друга. Это создаёт неразрешимую зависимость, которую интерпретатор не может обработать.
Почему это проблема?
Когда модуль A
импортирует модуль B
, Python выполняет код B
. Если в процессе этого B
пытается импортировать A
, то A
на этот момент ещё не полностью загружен. Это приводит к ошибкам, чаще всего ImportError
или AttributeError
при попытке доступа к атрибутам, которые ещё не были определены.
Пример, приводящий к ошибке:
# a.py
import b
def func_a():
print("Функция из A")
b.func_b()
func_a()
# b.py
import a
def func_b():
print("Функция из B")
# При запуске python a.py возникнет AttributeError,
# так как в момент импорта b в a, модуль a еще не содержит func_a.
Способы решения:
- Рефакторинг: Вынести общую функциональность, от которой зависят оба модуля, в третий, независимый модуль.
-
Локальный импорт: Импортировать модуль внутри функции или метода, который его использует. Это откладывает импорт до момента вызова, когда все модули уже будут загружены.
# a.py def func_a(): import b # Локальный импорт print("Функция из A") b.func_b()
- Изменение точки входа: Иногда проблема решается изменением файла, который запускается первым.
Циклические импорты почти всегда указывают на проблемы в архитектуре приложения, которые следует исправлять.