__enter__
次のように定義された__exit__
メソッドを持つクラスがあるとします。
class MyClass:
def f(self):
raise Exception
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
pass
ブロック内で例外が発生した場合、次のwith
ようになります。
with MyClass() as ins:
ins.f()
__exit__
メソッドは暗黙的に呼び出されます。これは非常に優れています。
ただし、クラスが次のような場合:
class MyClass:
def __init__(self):
self.f()
def f(self):
raise Exception
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
pass
そして、次のようにインスタンス化します。
with MyClass() as ins:
pass
__init__
メソッド内で例外が発生した場合、__enter__
まだ__exit__
呼び出されておらず、呼び出しも解除されますが、これはあまり良くありません。これを改善する最善の方法は何ですか?