Попытка справиться с циклическими зависимостями с помощью инверсии зависимостей в Python

#python #circular-dependency #dependency-inversion

#python #циклическая зависимость #зависимость-инверсия

Вопрос:

Вот простая диаграмма, которая иллюстрирует проблему

Описание: существует объект конвейера, который содержит объект источника, источник проверяется с помощью SourceValidator, а он, в свою очередь, для проверки источника должен создать тестовый конвейер, который может быть создан с помощью PipelineManager . Таким образом, существует циклическая зависимость двух пакетов друг от друга.

На статически типизированном языке я бы создал интерфейс, от которого будет зависеть SourceValidator, а в пакете конвейера я бы реализовал его и внедрил конкретный экземпляр в SourceValidator, используя контейнер для внедрения зависимостей

Но, как я знаю, это не питонический способ использования контейнеров для внедрения зависимостей, поэтому, пожалуйста, кто-нибудь может помочь понять, каким будет питонический способ решения этой проблемы?

Комментарии:

1. Если уже существует объект конвейера, не означает ли это, что уже существует PipelineManager, который может помочь создать тестовый конвейер?

2. Да, конечно, но когда я пытаюсь импортировать его внутри исходного пакета, это вызывает циклический импорт. модуль конвейера импортирует исходный пакет, исходные init.py импортирует валидатор, менеджер импорта валидатора, менеджер импортирует класс конвейера, а конвейер еще не определен.

3. Что ж, Дзен Python (do import this в CLI) читается There should be one-- and preferably only one --obvious way to do it. , и ваше решение применимо к любому языку программирования. Это «алмазная проблема», и то, что вы предлагаете, звучит как правильный способ сделать это для меня. Вам нужен конкретный экземпляр для наследования и прерывания цикла.

4. Я не вижу причин не делать этого, вот пример medium.com/@shivama205/dependency-injection-python-cb2b5f336dce . Я имею в виду, вы могли бы попробовать использовать пространства имен и издеваться над экземпляром, но в глубине души это одно и то же решение.

5. прочитал эту статью, просто не был уверен, что это лучший подход, спасибо за ответы 🙂