Менеджер контекста Python

Хотя менеджеры контекста Python широко используются, немногие понимают цель их использования. Эти операторы, обычно используемые при чтении и записи файлов, помогают приложению сохранять системную память и улучшать управление ресурсами, гарантируя, что определенные ресурсы используются только для конкретных процессов.

Оператор with

Менеджер контекста — это объект, который уведомляется о начале и конце контекста (блока кода). Обычно вы используете его с оператором with. Он берет на себя уведомление.

Например, файловые объекты являются менеджерами контекста. Когда контекст заканчивается, файловый объект закрывается автоматически:

# Менеджер контекста: автоматически обрабатывает очистку ресурсов
# Файл автоматически закрывается при выходе из блока 'with'
with open(filename) as f:  # 'f' — это файловый объект
    file_contents = f.read()

# Файл автоматически закрыт здесь, даже если произошла ошибка
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Каково основное преимущество использования менеджера контекста (оператора with)?
A. Автоматически обрабатывает очистку ресурсов, даже если возникает ошибка
B. Ускоряет выполнение кода
C. Позволяет одновременно открывать несколько файлов
D. Предотвращает все ошибки

Все, что приводит к завершению выполнения блока, вызывает вызов метода выхода менеджера контекста. Это включает исключения и может быть полезно, когда ошибка приводит к преждевременному выходу из открытого файла или соединения. Завершение работы скрипта без надлежащего закрытия файлов/соединений — плохая идея, которая может привести к потере данных или другим проблемам. Используя менеджер контекста, вы можете гарантировать, что меры предосторожности всегда принимаются для предотвращения повреждения или потерь таким образом.

Написание собственного менеджера контекста

Также возможно написать менеджер контекста, используя синтаксис генератора благодаря декоратору contextlib.contextmanager:

# Менеджер контекста на основе функции с использованием декоратора contextlib
import contextlib
@contextlib.contextmanager
def context_manager(num):
    print('Enter')  # Код до yield выполняется при __enter__
    yield num + 1   # Значение, возвращаемое через yield, становится переменной 'cm'
    print('Exit')    # Код после yield выполняется при __exit__

with context_manager(2) as cm:  # cm получает возвращенное значение (3)
    print('Right in the middle with cm = {}'.format(cm))
Enter
Right in the middle with cm = 3
Exit

Менеджер контекста на основе класса

Вы можете определить менеджер контекста на основе класса. Ключевыми методами являются __enter__ и __exit__

# Менеджер контекста на основе класса: реализуйте методы __enter__ и __exit__
class ContextManager:
    def __enter__(self, *args, **kwargs):  # Вызывается при входе в блок 'with'
        print("--enter--")
        return self  # Может вернуть объект для использования в качестве переменной 'as'

    def __exit__(self, *args):  # Вызывается при выходе из блока 'with'
        print("--exit--")

with ContextManager():  # Вызывает __enter__, затем __exit__ по завершении
    print("test")
--enter--
test
--exit--
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Какие методы должен реализовать класс, чтобы использоваться в качестве менеджера контекста?
A. **init** и **del**
B. **enter** и **exit**
C. open и close
D. start и stop

Связанные ссылки