Python检查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
为True,则RuntimeError
方法会引发not self.fp
异常。
请注意,依赖此类内部的,未记录的实现可能会很毛茸茸;如果未来的实现改变你的代码将破坏,也许是微妙的方式。确保您的项目具有良好的测试覆盖率。
或者,您可以创建一个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的建议。