Они всегда * оба выполнены. Единственное различие заключается в том, что если вы не используете as
, возвращаемое значение функции __enter__
будет отброшено. Точные шаги изложены очень хорошо в with
statement documentation.
class T(object):
def __enter__(self):
print('entering')
return self
def __exit__(self, exc_t, exc_v, trace):
print('exiting')
with T():
pass
>>> entering
>>> exiting
Единственное различие, можно ли использовать созданный объект или нет:
with T() as t:
print(t)
>>> entering
>>> <__main__.T object at 0x00B34810>
>>> exiting
Обратите внимание, что второй пример также показывает когда__exit__
называется: в частности, это называется, когда цикл завершается ,
* Единственный раз, когда они оба не выполняются, если __enter__
генерирует исключение, в этом случае свита контексте менеджера никогда не достиг, и __exit__
не будет называться.
Почему бы вам просто не попробовать? – kirelagin
Я просто хотел подтвердить, что не дошел до неправильного вывода :) – user1431282