Вопрос проверяет знание протокола контекстного менеджера и понимание, какие методы позволяют объекту работать с with.
Контекстный менеджер в Python должен реализовывать два метода: __enter__ и __exit__. Метод __enter__ вызывается при входе в блок with. Метод __exit__ вызывается при выходе из него. Эти методы позволяют управлять ресурсами, например файлами или соединениями. Без них объект не может использоваться в with.
Контекстный менеджер в Python основан на специальном протоколе, который определяет поведение объекта при входе и выходе из блока with.
Определение: Контекстный менеджер — это объект, который управляет ресурсом и гарантирует корректное освобождение этого ресурса.
Для этого он должен реализовать два метода.
__enter__Этот метод вызывается в момент входа в блок with.
Инициализирует ресурс
Может возвращать объект, доступный внутри with
Результат присваивается переменной после as
def __enter__(self):
return self
__exit__Этот метод вызывается при выходе из блока with.
Освобождает ресурс
Вызывается даже при возникновении ошибки
Получает информацию об исключении
def __exit__(self, exc_type, exc_val, exc_tb):
pass
Параметры:
exc_type — тип исключения
exc_val — объект исключения
exc_tb — traceback
Если __exit__ возвращает True, исключение считается обработанным.
Исключение не пробрасывается дальше
Если вернуть False или None, ошибка поднимется выше
Контекстные менеджеры активно используются в стандартной библиотеке.
Работа с файлами
Блокировки
Подключения к БД
Управление транзакциями
Контекстный менеджер обязательно должен реализовывать __enter__ и __exit__, чтобы безопасно управлять ресурсами и гарантировать их корректное освобождение.