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
Арифметические операторы
На заметку
Читайте нас в Twitter. Ссылка в самом низу страницы.