2013-06-12 6 views
2

При использовании инструкции with без as функция __enter__ никогда не будет выполнена, но метод __exit__ будет?Операция «с» в python __exit__

Пример:

with test: 
    test.do_something 

test.__exit__() будет выполнен в конце, но с пунктом test.__enter__() не будет?

+3

Почему бы вам просто не попробовать? – kirelagin

+1

Я просто хотел подтвердить, что не дошел до неправильного вывода :) – user1431282

ответ

10

Они всегда * оба выполнены. Единственное различие заключается в том, что если вы не используете 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__ не будет называться.

Смежные вопросы