Как реализовать свой контекстный менеджер?
Уровень: Senior
Ответ
Есть два способа: 1) Через класс, реализующий методы __enter__ и __exit__. При входе в with вызовется __enter__ (возвращает ресурс, если надо), а по выходе (даже при исключении) вызовется __exit__ (для освобождения ресурса). 2) Через декоратор @contextlib.contextmanager, который позволяет написать функцию-генератор с одним yield: всё до yield – код __enter__, после yield – код __exit__. Функция, декорированная contextmanager, вернёт объект-контекстный менеджер.