Назад к вопросам
Middle
74
questionbank

Как создать контекстный менеджер в 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()

Оба метода позволяют корректно управлять ресурсами, обеспечивая их освобождение даже при возникновении ошибок.