Как добиться внедрения типизированных зависимостей в Python, избегая при этом циклического импорта? [дубликат] ⇐ Python

Программы на Python
Anonymous
Как добиться внедрения типизированных зависимостей в Python, избегая при этом циклического импорта? [дубликат]

Сообщение Anonymous »

Я работаю над проектом Python и хочу реализовать внедрение зависимостей с безопасностью типов. Вот упрощенная версия моей текущей структуры:
a.py:

Код: Выделить всё

   class A:
def __init__(self, b):
self.b = b

def run(self):
print(self.b.get_text()) # blindly calling the function because b is not typed
b.py:

Код: Выделить всё

from app.a import A

class B:
def run(self):
a = A(self)
a.run()

def get_text(self):
return "hello world"
main.py:

Код: Выделить всё

from app.b import B

if __name__ == "__main__":
b = B()
b.run()
Я хочу правильно ввести аргумент b в конструкторе A (a.py). Однако, как и ожидалось, импорт B напрямую вызывает циклический импорт.
Что я пробовал:

[*]Протоколы: это работает, но приводит к большому дублированию кода,
особенно при внедрении нескольких классов.
[*]Абстрактные базовые классы (ABC): тоже работает, но если подкласс добавляет новые
свойства, проверка типов становится затруднительной, поскольку внедренный класс не может точно отражать эти свойства.
[*]

Код: Выделить всё

if TYPE_CHECKING
Часто рекомендуется использовать вуду (подсказка типа Python без циклического импорта), это может быть решением, но выглядит очень хакерски.

< /ul>
Вопрос:
Какой наиболее удобный и типобезопасный подход к внедрению зависимостей в Python, позволяющий избежать циклического импорта?
Есть ли какие-либо передовые методы или шаблоны проектирования, которые позволяют более элегантно справиться с этой ситуацией?
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/790 ... cular-impo

Вернуться в «Python»