2012-08-10 134 views
0

Python中检查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

你是什么意思“已经”?什么时候该文件可以由谁关闭? – 2012-08-10 08:22:01

回答

3

在内部,有一个打开的文件指针,称为fp,get的清除关闭;您可以测试该自己太:

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

zipfile module source;如果not self.fp为真,open方法将引发RuntimeError异常。

请注意,依赖这样的内部的,未公开的实现可能是毛茸茸的;如果将来的实现改变了你的代码,可能会以微妙的方式破坏。确保您的项目具有良好的测试覆盖率。

或者,你可以创建一个ZipFile的子类并覆盖.close的方法来跟踪状态,这将打破由于内部变化的风险少:

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和重写关闭()与方法,指示该实例已关闭? – aknuds1 2012-08-10 08:34:29

+0

@ aknuds1:这不是问题;调用'.close()'多次工作正常。这是OP开放呼叫是OP的问题。 – 2012-08-10 08:37:03

+0

我的想法是补救没有公共状态指示ZipFile是否已关闭,通过继承ZipFile你可以自己实现该状态。 – aknuds1 2012-08-10 08:40:02