Какой принцип SOLID реализует механизм зависимостей (Depends) в FastAPI

«Какой принцип SOLID реализует механизм зависимостей (Depends) в FastAPI» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Механизм Depends в FastAPI является реализацией принципа инверсии зависимостей (Dependency Inversion Principle, D) из SOLID.

Этот принцип утверждает, что модули высокого уровня не должны зависеть от модулей низкого уровня. И те, и другие должны зависеть от абстракций.

В FastAPI Depends работает как система внедрения зависимостей (Dependency Injection). Это позволяет:

  • Декларировать зависимости прямо в сигнатуре функции-обработчика.
  • Отделить бизнес-логику эндпоинта от логики получения зависимостей (например, сессии БД, аутентификации пользователя).
  • Упростить тестирование, так как зависимости можно легко подменить (mock).

Пример:

from fastapi import Depends, FastAPI

app = FastAPI()

# Абстракция: функция, предоставляющая зависимость (например, сессию БД)
def get_db_session():
    db_session = "fake_db_session"
    try:
        yield db_session
    finally:
        print("DB session closed")

# Модуль высокого уровня (эндпоинт)
@app.get("/items/")
async def read_items(db = Depends(get_db_session)):
    # Эндпоинт не создает сессию сам, а получает ее через Depends.
    # Он зависит от абстракции `get_db_session`, а не от конкретной реализации.
    return {"message": f"Items read from {db}"}