0

ZipFileオブジェクトがまだ閉じられていないかどうかをPythonで確認する最良の方法は何ですか?

今のところ、私はクラスでこれをやっています:

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

内部的には、fpクローズ時にクリアされるオープン ファイル ポインタがあります。あなたもそれを自分でテストすることができます:

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 に答える