Почему finally возвращает None вместо результата db.get

Если db.close() завершится успешно, a будет None: return в finally заменяет результат из try и даже подавляет исключение, возникшее в db.get().

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

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

Если db.close() завершится успешно, a будет None: return в finally заменяет результат из try и даже подавляет исключение, возникшее в db.get().

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

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

Условие

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

a = await get_user(15, db) # a?

Ответ

Если db.close() завершится успешно, a будет None: return в finally заменяет результат из try и даже подавляет исключение, возникшее в db.get().

Блок finally выполняется перед фактическим возвратом из функции. Его return None становится окончательным результатом, независимо от найденного пользователя. Если само закрытие выбросит исключение, наружу пойдёт оно, а присваивание a не завершится.

Уберите return из finally. При этом переданный db обычно принадлежит внешнему коду, поэтому закрывать его здесь вообще не следует: жизненным циклом сессии управляет владелец или dependency/context manager. Функция поиска должна возвращать пользователя либо None при отсутствии, не скрывая ошибки соединения.

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

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

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

Подробнее