Различия между использованием Depends и прямым вызовом функции

Depends разрешает пользователя в контексте каждого запроса и поддерживает граф зависимостей. Прямой вызов в default-параметре происходит при определении функции.

Короткий ответ

Что ответить на собеседовании

Depends разрешает пользователя в контексте каждого запроса и поддерживает граф зависимостей. Прямой вызов в default-параметре происходит при определении функции.

Подробный разбор

Ответ с пояснениями

Условие

Рассмотрим пример в FastAPI, демонстрирующий, какие преимущества даёт применение Depends(get_current_user) вместо непосредственного вызова get_current_user().

# FastAPI
Depends()
@route.get('...')
async def get_books(
    current_user=Depends(get_current_user),
    current_user=get_current_user()
)

Ответ

Depends разрешает пользователя в контексте каждого запроса и поддерживает граф зависимостей. Прямой вызов в default-параметре происходит при определении функции.

Исходный фрагмент содержит два одинаковых параметра и потому не компилируется. Оставьте только dependency:

@route.get('/books')
async def get_books(current_user=Depends(get_current_user)):
    return {'user_id': current_user.id}

FastAPI сам получает необходимые параметры запроса, вызывает вложенные зависимости и поддерживает их переопределение в тестах. Для async-зависимости он ожидает результат, а ресурсы с yield корректно завершает согласно её жизненному циклу.

Вызов get_current_user() в объявлении параметра не является внедрением зависимости: результат вычислится заранее, а async-вариант создаст корутину. Вызов внутри тела допустим, но всю координацию тогда нужно делать вручную.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее