🤯 Загадка с собеса: как finally тайно переписывает return
Представь, что функция успешно выполнила код и готова отдать результат. Но тут в дело вступает блок очистки и молча ломает логику.
def get_number():
try:
return 1
finally:
return 2
print(get_number())
⚙️ Почему функция вернет 2
🔹 Блок finally выполняется всегда, независимо от того, была ли ошибка.
🔹 Когда в try срабатывает return, Python запоминает это значение, но перед выходом обязательно заходит в finally.
🔹 Если там есть свой return, он получает абсолютный приоритет и перезаписывает первоначальный ответ.
⚠️ В чём реальная опасность
🔸 Тихое поглощение исключений: Если внутри try произойдет сбой (например, деление на ноль), а в finally стоит return, ошибка просто исчезнет. Программа пойдет дальше, скрыв критический баг.
🔸 Сломанный поток: Операторы break или continue в блоке очистки создают такие же непредсказуемые последствия.
💡 Блок finally нужен только для закрытия файлов и освобождения ресурсов — никогда не возвращай из него значения.