with
Позволяет реализовать контекст исполнения определённого кода.
Инструкция позволяет задействовать менеджер контекста для исполнения кода, находящего в её теле. Это, в частности, позволяет обособить блоки, использующие try except finally и повысить шансы их повторного использования.
Последовательность действий инструкции
1. Выражение после
2. Для последующего использования запоминается метод менеджера __exit__();
3. Вызывается метод менеджера __enter__();
4. Если после
5. Выполняется тело инструкции;
6. Вызывается метод
+py3.1 Несколько менеджеров можно указать через запятую:
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()
Синонимы поиска: with
В разделе «Simple Statements (простые инструкции, операторы)»:
assert
del
pass
raise
Арифметические операторы
На заметку
В разделе «События» можно узнать о надвигающихся событиях мира Python, а также поделиться своими. Если вы являетесь организатором встречи/конференции/спринта, зарегистрируйте это событие в указанном разделе, чтобы о нём узнали все желающие.