在 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...
有没有更好的办法?
在内部,有一个名为fp
get 的打开文件指针在关闭时被清除;你也可以自己测试:
if not self.zf.fp:
self.zf = zipfile.ZipFile(self.path)
查看zipfile
模块源代码;如果为 True ,则该open
方法引发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 的建议。