開いているファイルへの強い参照を保持するクラスがあります。コードが例外なく実行される場合、ファイルを閉じるクラスのメソッドを明示的に呼び出すため、ファイルは正しく閉じられます。ただし、例外がスローされた場合、ファイルは正しく閉じられません。
これが私のコードのモックアップ版です:
class MyFile(object):
def __init__(self, filename, mode):
self._handle = open(filename, mode)
@classmethod
def open(cls, filename, mode):
return MyFile(filename, mode)
def close(self):
self._handle.close()
def __del__(self):
self.close()
def writerow(data):
# Special write
pass
def __enter__(self):
return self
def __exit__(self, *exc_info):
self.close()
このクラスをコードの最上位で使用する場合、with ステートメントを使用します。
def get_some_dat():
return 1
with MyFile.open('foo.txt', 'w') as f:
# do stuff with f
data = get_some_data()
f.writerow(data)
ただし、MyFile は別のオブジェクトによって間接的に開かれます。ほとんどの Pythonistas は、ファイルを明示的に閉じる必要があると言うでしょうが、オブジェクトが破棄されたときにファイルが閉じられるようにしたいと思います。私が書いたコードはそのトリックを実行しますが、この動作を実装するためのより良い方法について提案があるかどうか疑問に思っていました.