Зачем в бэкенде инверсия и внедрение зависимостей и как это выглядит в Python?
Инверсия зависимостей — принцип: модуль зависит от абстракции, и владеет этой абстракцией он сам, а не инфраструктура. Внедрение зависимостей — приём: конкретную реализацию передают снаружи, обычно аргументом конструктора, вместо того чтобы создавать её внутри. DI-контейнер — необязательный инструмент, который собирает граф объектов; принцип можно соблюдать и без него. В Python контракт удобно описывать протоколом: реализация подходит по набору методов, наследование не требуется, а совместимость проверяется статически. Выгода прикладная: зависимости видны в сигнатуре, а в тестах на место почты или платёжного шлюза встаёт фейк — без сети и без базы. Цена — лишний уровень непрямоты, поэтому интерфейс на единственную реализацию «на будущее» только мешает.