當您使用open
時,請嘗試將其用作上下文管理器。這樣一來,無論發生什麼事情,它就會當你用它做封閉:
with open('file.txt', 'r') as fin:
# Access fin like normal
# No matter what happens, after the block, it's closed!
或者,你可以用自己的功能,爲你做一些額外的記錄替換的open
和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+')
這當然不是在世界上最漂亮的事情,但如果你能猴子補丁,那麼你會至少能夠處理遺留代碼。
這可能是一個例外,因爲'file.close()'調用永遠不會發生。您可以使用'try' /'finally'來避免這種情況,但[with'語句](http://www.youtube.com/watch?v=lRaKmobSXF4)可以幫您。 – 2013-05-10 17:44:22