Позволяет реализовать контекст исполнения определённого кода.
Инструкция позволяет задействовать менеджер контекста для исполнения кода, находящего в её теле. Это, в частности, позволяет обособить блоки, использующие try except finally и повысить шансы их повторного использования.

    class MyContextManager(object):

def __enter__(self):
print('enter')

def __exit__(self, exc_type, exc_value, traceback):
print('exit')



with MyContextManager(): # enter
print('do') # do
# exit

Последовательность действий инструкции

1. Выражение после with вычисляется для получения менеджера контекста;
2. Для последующего использования запоминается метод менеджера __exit__();
3. Вызывается метод менеджера __enter__();
4. Если после as указана цель, то в неё помещается результат __enter__();

На заметку
Инструкция гарантирует вызов __exit__(), в случаях, когда __enter__() отработал без ошибок. Если исключение происходит во время назначения цели as, то оно равноценно исключению, произошедшему в теле.

5. Выполняется тело инструкции;
6. Вызывается метод __exit__(). Если выход обусловлен исключением, то данные о нём передаются в метод. Если __exit__() вернул ложь, то по выходу из контекстного менеджера исключение продолжит своё восхождение по стеку. В случае истины, исключение будет подавлено.

+py3.1 Несколько менеджеров можно указать через запятую:

    with manager1() as one, manager2() as two:
do()

# То же самое, вложенно:
with manager1() as one:
with manager2() as two:
do()


Нет обсуждений для отображения.
Если у вас есть, что сказать, можете представиться и исправить ситуацию.