を使用する場合はopen
、コンテキスト マネージャーとして使用してみてください。そうすれば、何が起こっても、作業が完了すると閉じられます。
with open('file.txt', 'r') as fin:
# Access fin like normal
# No matter what happens, after the block, it's closed!
open
別の方法として、 andのインスタンスを、close
追加のロギングを行う独自の関数に置き換えることもできます。
def my_open(filename, *args):
logger.debug('Opening %s' % filename)
return open(filename, *args)
def my_close(file_obj):
logger.debug('Closing %s' % file_obj.name)
return file_obj.close()
最後の手段として、問題のコードにアクセスできない場合、またはコードを変更するのが面倒な場合は、関数にモンキー パッチを適用してみてください。
import traceback
class MyFile(file):
@staticmethod
def open(*args, **kwargs):
return MyFile(*args, **kwargs)
def __init__(self, *args, **kwargs):
self._file = self._open(*args, **kwargs)
print('Opening %s from %s' % (
self._file.name, ''.join(traceback.format_stack())))
def close(self):
print('Closing file %s from %s' % (
self._file.name, ''.join(traceback.format_stack())))
self._file.close()
# Now the monkey-patching
file = MyFile
MyFile._open = open
open = MyFile.open
o = open('hello', 'w+')
これは確かに世界で最も美しいものではありませんが、モンキー パッチを適用できれば、少なくともレガシー コードを処理することができます。