3

withなしでステートメントを使用するasと、__enter__関数は実行されませんが、__exit__メソッドは実行されますか?

例:

with test:
  test.do_something

test.__exit__()with句の最後で実行されますが、実行されtest.__enter__()ませんか?

4

1 に答える 1

12

それらは常に*両方とも実行されます。唯一の違いは、 を使用しない場合as、関数の戻り値__enter__が破棄されることです。with正確な手順は、ステートメントのドキュメントに非常にうまく配置されています。

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

2 番目の例は、いつ 呼び出されるかを示していることに注意してください__exit__。具体的には、ループが完了したときに呼び出されます。


*両方が実行されないの__enter__は、例外がスローされた場合のみです。この場合、コンテキスト マネージャーのスイートには到達__exit__せず、呼び出されません。

于 2013-06-12T22:02:11.373 に答える