h5py を使用して HDF5 ファイルにアクセスし、h5py File オブジェクトをクラスに格納しています。しかし、閉じた h5py ファイル インスタンス変数を新しい変数に再割り当てしようとすると、奇妙な動作が発生します。
class MyClass:
def __init__(self, filename):
self.h5file = None
self.filename = filename
def vartest(self):
self.h5file = h5py.File(self.filename, 'r')
print self.h5file
self.h5file.close()
print self.h5file
newh5file = h5py.File(self.filename, 'r')
print newh5file
self.h5file = newh5file
print self.h5file
print newh5file
def main():
filename = sys.argv[1]
mycls = MyClass(filename)
mycls.vartest()
出力:
<HDF5 file "test.h5" (mode r, 92.7M)>
<Closed HDF5 file>
<HDF5 file "test.h5" (mode r, 92.7M)>
<Closed HDF5 file>
<Closed HDF5 file>
新しく開いた h5py File オブジェクトでインスタンス変数を更新しようとすると、何らかの形でオブジェクトの状態に影響を与え、オブジェクトが閉じられたようです。h5py 側の実装に関係なく、Python 言語 (つまり、代入演算子のオーバーロードがないこと) の理解から、この動作がどのように理にかなっているのかわかりません。
この例は Python 2.6.5 と h5py 1.3.0 で実行されます。この例を試してみたいが、HDF5 ファイルが手元にない場合は、ファイル アクセス モードを 'r' から 'a' に変更するだけです。