Iterator类无法对用h5py打开的HDF5数据引发StopIteration

问题描述 投票:0回答:1

我正在尝试为h5数据集实现一个可迭代的类。

class Argh():
    def __init__(self, data):
        self.data = data
        self.c_idx = 0 

    def __getitem__(self, idx):
        return self.data[idx]

    def __len__(self):
        return len(self.data)

    def __next__(self):
        try:
            x = self.data[self.c_idx]
        except IndexError or ValueError:
            raise StopIteration
        self.c_idx += 1
        return x

    def __iter__(self):
        return self

[当我尝试按顺序执行它时,它在StopIterationValueError出现之前未能引发IndexError异常。如果我只是直接遍历h5数据集,或者如果我通过索引和getitem使用迭代,则不会发生这种情况:

with h5py.File('test.h5', 'w') as f:
     f.create_dataset(name='matrix', data=np.arange(10), dtype=np.float32)

f =  h5py.File('test.h5', 'r')
A = Argh(np.arange(0,10))
B = Argh(f['matrix'])

for x in A: pass
for x in B.data: pass
for i in range(len(B)): B[i]
for x in f['matrix']: pass
for x in B: pass
ValueError  Traceback (most recent call last)
<ipython-input-7-1dcb814e7a79> in <module>
      3 for i in range(len(B)): B[i]
      4 for x in f['matrix']: pass
----> 5 for x in B: pass
ValueError: Index (10) out of range (0-9)

我已经在包括zarr数组的其他几个对象上进行了测试,但是仅对于h5py打开的h5数据集观察到了此行为。

python hdf5 iterable h5py stopiteration
1个回答
0
投票

IndexError or ValueError是计算结果为IndexError的表达式。匹配多个异常类型的语法是

except (IndexError, ValueError):
© www.soinside.com 2019 - 2024. All rights reserved.