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)이 당신을 대신합니다. –