Depends включает функцию в граф зависимостей запроса. Прямой вызов в значении параметра выполняется при объявлении обработчика, а не отдельно для каждого запроса.
Сравнение применения Depends и обычного вызова функции в FastAPI
Depends включает функцию в граф зависимостей запроса. Прямой вызов в значении параметра выполняется при объявлении обработчика, а не отдельно для каждого запроса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разобрать пример на FastAPI и понять, какие выгоды даёт использование Depends(get_current_user) по сравнению с прямым вызовом get_current_user().
# FastAPI
Depends()
@router.get('/books')
async def list_books(
user=Depends(get_current_user),
user=get_current_user()
)
Ответ
Depends включает функцию в граф зависимостей запроса. Прямой вызов в значении параметра выполняется при объявлении обработчика, а не отдельно для каждого запроса.
Исходный пример синтаксически некорректен: параметр user объявлен дважды. Правильная форма:
@router.get('/books')
async def list_books(user=Depends(get_current_user)):
return {'user_id': user.id}
FastAPI разрешает подзависимости, передаёт параметры запроса, поддерживает async-зависимости и завершение ресурсов через yield, а также переопределение зависимостей в тестах. Результат обычно кешируется в пределах одного запроса.
user=get_current_user() вычисляется при определении функции; для async-функции получится объект корутины, а не текущий пользователь. Явный вызов внутри тела возможен, но тогда передачу параметров, ожидание и управление ресурсами нужно организовать самостоятельно.