Async get_user: отсутствующий db и return None в finally

return None в finally перекрывает return user и может подавить исключение. Кроме того, показанный вызов не передаёт обязательный db; без корректного вызова и await запрос не выполнится.

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

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

return None в finally перекрывает return user и может подавить исключение. Кроме того, показанный вызов не передаёт обязательный db; без корректного вызова и await запрос не выполнится.

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

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

Условие

async def get_user(user_id: int, db: AsyncSession): try: user = await db.get(User, user_id) return user finally: await db.close() return None

q = get_user(76576, )

Ответ

return None в finally перекрывает return user и может подавить исключение. Кроме того, показанный вызов не передаёт обязательный db; без корректного вызова и await запрос не выполнится.

Если сессией владеет вызывающий код, функция не должна закрывать её:

async def get_user(user_id, db):
    return await db.get(User, user_id)

# Внутри async-функции с готовой сессией:
# user = await get_user(76576, db)

User и db здесь принадлежат приложению. В исходном q = get_user(76576,) сначала возникает ошибка аргументов; при исправленном вызове async-функция возвращает coroutine до await. Закрытие ресурса размещают у его владельца, без return в finally.

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

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

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

Подробнее