
How are you
В питоне есть оператор
with
. Размещенный внутри код выполняется с особенностью: до и после гарантированно срабатывают события входа в блок
with
и выхода из него. Объект, который определяет эту логику, называется контекстным менеджером.
События входа и выхода из блока определены методами
__enter__
и
__exit__
. Первый срабатывает в тот момент, когда ход исполнения программы переходит внутрь
with
. Метод может вернуть значение. Оно будет доступно низлежащему внутри блока
with
коду.
__exit__
срабатывает в момент выхода из блока, в т.ч. и по причине исключения. В этом случае в метод будет передана тройка значений
(exc_class, exc_instance, traceback)
.
Самый распространённый контекстный менеджер – класс, порожденный функцией
open
. Он гарантирует, что файл будет закрыт даже в том случае, если внутри блока возникнет ошибка.
Нужно стараться выходить из контекстного менеджера как можно быстрее, чтобы освобождать контекст и ресурсы.
Пример реализации своего контекстного менеджера на основе класса:
Пример реализации своего контекстного менеджера с использованием встроенной библиотеки contextlib
Контекстные менеджеры также можно использовать для временной замены параметров, переменных окружения, транзакций БД.
Oct. 10, 2023, Источник