0

在 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...

有没有更好的办法?

4

1 回答 1

3

在内部,有一个名为fpget 的打开文件指针在关闭时被清除;你也可以自己测试:

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 的建议

于 2012-08-10T08:24:01.533 回答