with
なしでステートメントを使用するas
と、__enter__
関数は実行されませんが、__exit__
メソッドは実行されますか?
例:
with test:
test.do_something
test.__exit__()
with句の最後で実行されますが、実行されtest.__enter__()
ませんか?
with
なしでステートメントを使用するas
と、__enter__
関数は実行されませんが、__exit__
メソッドは実行されますか?
例:
with test:
test.do_something
test.__exit__()
with句の最後で実行されますが、実行されtest.__enter__()
ませんか?
それらは常に*両方とも実行されます。唯一の違いは、 を使用しない場合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__
せず、呼び出されません。