Ответ
Ответ не найден
Ответ 18+ 🔞
Да ты посмотри, какой прикол, блядь! Вот сидишь ты, значит, пишешь на Python, всё по феншую, импорты, классы, декораторы... А потом — бац! — и вылезает эта хуйня под названием «циклический импорт». Ну ёпта, реально, как будто два мудака в узком коридоре встретились и оба упёрлись: «Нет, ты первый проходи!», «Нет, ты, сука, первый!». И стоят, блядь.
Вот смотри, простой пример, от которого мозг вскипает, как чайник у бабки в деревне.
module_a.py
from module_b import some_function_from_b # Опа, бля! Сейчас начнётся!
def function_from_a():
print("Я из модуля A, и я вызываю B")
return some_function_from_b()
module_b.py
from module_a import function_from_a # А этот, блядь, уже тянет обратно! Пиздец!
def some_function_from_b():
print("А я из модуля B, и я зову A")
return function_from_a()
Запускаешь это добро — и получаешь ImportError: cannot import name.... Чистая магия, ёбана! Интерпретатор такой: «Мужик, ты вообще, блядь, в своём уме? Они друг на друга ссылаются, как два пьяных деда у подъезда! Я не могу решить, кто из них первый, я сваливаю!».
А корень зла, блядь, в чём? В том, что Python, когда импортирует модуль, выполняет его код сверху вниз. И вот он начинает грузить module_a, видит строчку from module_b import..., перепрыгивает туда, а там — охуительная история! — from module_a import.... Но module_a же ещё не допился до конца, он в процессе, он полуфабрикат, блядь! И Python такой: «Ну нахуй, я пас». И кидает тебе эту ошибку, как горячую картошку.
Что делать-то, спрашивается? А выхода, по сути, два, и оба — с подвохом, как всегда.
Первый способ — отложить импорт. То есть не тянуть его в самом начале файла, а спрятать куда подальше, прямо внутрь функции, где он реально нужен.
# module_a.py
def function_from_a():
from module_b import some_function_from_b # Ага, вот теперь, бля, когда позовут — тогда и приду!
print("Я из модуля A")
return some_function_from_b()
# module_b.py
def some_function_from_b():
from module_a import function_from_a # И этот тоже!
print("А я из B")
return function_from_a()
Работать будет, да. Но, блядь, выглядит как костыль из говна и палок. И каждый раз, когда функция вызывается, этот импорт будет выполняться — не смертельно, но, сука, некрасиво.
Второй способ — перепроектировать архитектуру, ёпта. Чаще всего циклическая зависимость — это знак, что ты накосячил с разбивкой логики. Вынеси то, что нужно обоим модулям, в третий, отдельный файл. Или используй абстрактные базовые классы, или интерфейсы. В общем, прояви, блядь, смекалку, а не городи одно на другое.
А бывает, что циклический импорт — это просто твоя поспешность, блядь. Проверь, реально ли тебе нужна вся функция из другого модуля, или достаточно только какой-то константы или данных. Может, стоит передать нужный объект как аргумент, а не импортить весь мир?
Короче, вывод простой, как три копейки: если встретил циклический импорт — это не Python тупой, это ты, сука, где-то налажал с дизайном. Остановись, выдохни, пересмотри структуру. Иначе потом будет больно, как от вилки в глаз.