Как добиться внедрения типизированных зависимостей в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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