#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. прочитал эту статью, просто не был уверен, что это лучший подход, спасибо за ответы 🙂