Как создать контекстный менеджер в Python?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Контекстный менеджер можно создать двумя основными способами: с помощью классов и с помощью генераторов с декоратором @contextmanager.
Создание с помощью класса:
Класс должен реализовать методы __enter__ и __exit__. Метод __enter__ вызывается при входе в контекстный блок (with) и может вернуть объект для использования внутри блока. Метод __exit__ вызывается при выходе из блока, даже при возникновении исключения. Он принимает три аргумента: тип исключения, значение исключения и объект traceback. Возвращение True из __exit__ подавляет исключение.
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self._file = None
def __enter__(self):
self._file = open(self.filename, self.mode)
return self._file
def __exit__(self, exc_type, exc_val, exc_tb):
if self._file:
self._file.close()
return False # Не подавлять исключение
Создание с помощью генератора и @contextmanager:
Модуль contextlib предоставляет декоратор @contextmanager, который позволяет создавать контекстные менеджеры с использованием генераторов. Внутри функции-генератора используется оператор yield. Код до yield выполняется при входе в контекст, а код после yield - при выходе.
from contextlib import contextmanager
@contextmanager
def open_file(filename, mode):
file = None
try:
file = open(filename, mode)
yield file # Возврат ресурса и приостановка
finally:
if file:
file.close()
Оба метода позволяют корректно управлять ресурсами, обеспечивая их освобождение даже при возникновении ошибок.