Depends разрешает пользователя в контексте каждого запроса и поддерживает граф зависимостей. Прямой вызов в default-параметре происходит при определении функции.
Различия между использованием Depends и прямым вызовом функции
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-вариант создаст корутину. Вызов внутри тела допустим, но всю координацию тогда нужно делать вручную.