内部的には、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 に感謝します。