Контекстный менеджер можно создать двумя основными способами: с помощью классов и с помощью генераторов с декоратором @contextmanager.
Создание с помощью класса:
Класс должен реализовать методы __enter__ и __exit__. Метод __enter__ вызывается при входе в контекстный блок (with) и может вернуть объект для использования внутри блока. Метод __exit__ вызывается при выходе из блока, даже при возникновении исключения. Он принимает три аргумента: тип исключения, значение исключения и объект traceback. Возвращение True из __exit__ подавляет исключение.
python
Создание с помощью генератора и @contextmanager:
Модуль contextlib предоставляет декоратор @contextmanager, который позволяет создавать контекстные менеджеры с использованием генераторов. Внутри функции-генератора используется оператор yield. Код до yield выполняется при входе в контекст, а код после yield - при выходе.
python
Оба метода позволяют корректно управлять ресурсами, обеспечивая их освобождение даже при возникновении ошибок.