Оператор with - менеджер контекста. Оператор with - менеджер контекста. Оператор with - менеджер контекста.

Оператор with - менеджер контекста.

Open in new window

Оператор with - менеджер контекста.

Рассмотрим такой пример кода.

f = open(filename)
try:
    do something
finally:
    f.close()

В начале мы открываем файл для чтения и в конструкции try совершаем с ним операции.

Для того, чтоб закрыть файл и освободить ресурс не зависимо от того, возникнет ли исключение или нет мы закрываем файл блоке finally.

Однако, если мы производим это много раз то такая конструкция может стать утомительной.

Более удобным подходом будет создание библиотечной функции, которая открывала и закрывала файл.

Для упрощения записи используется оператор with.

def controlled_execution(callback):
    f = open(filename)
    try:
        callback(thing)
    finally:
        f.close()

def my_function(thing):
    do something

controlled_execution(my_function)

Вместо функции, удобней использоваьть объект.

class СontrolledExecution:
    def __enter__(self):
        f = open(filename)
        return f
    def __exit__(self, type, value, traceback):
        tear f.close()

with СontrolledExecution() as thing:
     some code with thing

Оператор with задействует внутренний метод enter класса СontrolledExecution, который называется “хранителем контекста”.

Все что он возвращает будет присвоено переменной после ключевого слова as внутри блока.

Затем Python выполнит все что находится в блоке with и не зависимо от того что произойдет при выполнении в конце задействует метод exit. если исключения не было ему передается None.

Как дополнительный бонус, метод exit может перехватить исключение и информацию об ошибке.

def __exit__(self, type, value, traceback):
    return isinstance(value, TypeError)

Функция open поддерживает менеджер контекста и можно открыть файл гораздо проще.

with open("x.txt") as f:
    data = f.read()
    do something with data

В этом примере файл будет закрыт в независимости от результата внутри with.

Существует возможноть использовать сразу несколько операций.

with A() as a, B() as b:
    suite

Что будет эквивалентно записи.

with A() as a:
    with B() as b:
        suite

Other topics