Если db.close() завершится успешно, a будет None: return в finally заменяет результат из try и даже подавляет исключение, возникшее в db.get().
Почему finally возвращает None вместо результата 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 при отсутствии, не скрывая ошибки соединения.