2012-08-10 6 views
0

ZipFile 개체가 아직 닫혀 있지 않은지 파이썬에서 확인하는 가장 좋은 방법은 무엇입니까? 나는 수업 시간에이 일을하고있는 순간에 대한zipfile이 이미 닫혀 있지 않은지 확인하는 방법

:

try: 
    self.zf.open(archive_name).close() 
except RuntimeError: 
    self.zf = zipfile.ZipFile(self.path) 

with self.zf.open(archive_name) as f: 
    # do stuff... 

는 더 좋은 방법이 있나요?

+0

"이미"는 무엇을 의미합니까? 누구가 파일을 언제 닫을 수 있습니까? –

답변

3

내부적으로 닫히면 지워지는 fp이라는 열린 파일 포인터가 있습니다. 당신도 자신을 위해 그것을 테스트 할 수 있습니다 :

if not self.zf.fp: 
    self.zf = zipfile.ZipFile(self.path) 

zipfile module source을 참조하십시오; open 메서드는 not self.fp이 True 인 경우 RuntimeError 예외를 발생시킵니다.

문서화되지 않은 내부적 인 구현에 의존하는 것은 털이있을 수 있습니다. 미래의 구현이 코드를 변경하면 아마도 미묘한 방식으로 중단 될 것입니다. 프로젝트의 테스트 커버리지가 양호한 지 확인하십시오.

또는, ZipFile를 서브 클래스를 생성하고 내부 변화에 의한 파괴의 위험에 덜 될 상태, 추적 할 .close 메소드를 오버라이드 (override) 할 수 :

class MyZipFile(zipfile.ZipFile): 
    closed = False 
    def close(self): 
     self.closed = True 
     super(MyZipFile, self).close() 

if self.zf.closed: 
    self.zf = MyZipFile(self.path) 

제안에 대한 aknuds1 덕분에.

+0

불행히도 ZipFile이 닫혀 있는지 여부에 대한 다른 표시가없는 것 같습니다. 어쩌면 ZipFile을 서브 클래스 화하고 인스턴스가 닫혔다는 것을 나타내는 메소드로 close()를 오버라이드 (override) 할 생각인가? – aknuds1

+0

@ aknuds1 : 그건 문제가 아닙니다. '.close()'를 여러 번 호출하면 문제가 없다. OP를위한 문제인 * 열린 * 통화입니다. –

+0

제 아이디어는 ZipFile을 서브 클래 싱하여 ZipFile이 닫혀 있는지 여부를 나타내는 공개 상태가 없다는 것을 해결하는 것입니다. – aknuds1

관련 문제