Что такое Dependency Injection (DI)
Что проверяют
Отличаете ли вы принцип от библиотеки. Внедрение зависимостей это про архитектуру, контейнер это инструмент, и подмена одного другим слышна сразу.
Как отвечать
Dependency Injection это когда объект не создаёт свои зависимости сам, а получает их снаружи. Обычно через конструктор:
class OrderService:
def __init__(self, payments: PaymentGateway, log: Logger) -> None:
self._payments = payments
self._log = logЧто это даёт: класс зависит от абстракции, а не от конкретной реализации. В тесте вместо настоящей зависимости подставляется заглушка, в проде реализация меняется в одном месте, а по сигнатуре конструктора видно, от чего класс зависит вообще.
Способы внедрения: конструктор (по умолчанию, зависимость обязательна), свойство или сеттер (для необязательных), метод (когда нужна ровно в одном вызове).
Отдельный контейнер в Python нужен реже: сборка графа в точке входа и передача аргументов обычно достаточны. Во фреймворках механизм встроен, в FastAPI это Depends, где зависимость объявляется параметром обработчика и подменяется в тестах через dependency_overrides.
Где спотыкаются
Считают, что DI это библиотека. Передать зависимость руками в конструктор это уже DI, контейнер лишь избавляет от сборки графа вручную.
Просят зависимость у контейнера прямо внутри метода. Это Service Locator, и по сигнатуре больше не видно, что классу нужно.
Внедряют конкретный класс вместо абстракции, после чего подменить его в тесте нечем.
Тянут тяжёлый контейнер туда, где хватило бы явной сборки объектов в одной функции запуска.