迭代器 class 无法在使用 h5py 打开的 HDF5 数据上引发 StopIteration
Iterator class failing to raise StopIteration on HDF5 data opened with h5py
我正在尝试为 h5 数据集实现一个可迭代的 class。
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
当我尝试按顺序执行它时,它未能在 ValueError
或 IndexError
发生之前引发 StopIteration
异常。如果我只是直接遍历 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 数据集观察到此行为。
IndexError or ValueError
是一个计算结果为 IndexError
的表达式。匹配多个异常类型的语法是
except (IndexError, ValueError):
我正在尝试为 h5 数据集实现一个可迭代的 class。
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
当我尝试按顺序执行它时,它未能在 ValueError
或 IndexError
发生之前引发 StopIteration
异常。如果我只是直接遍历 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 数据集观察到此行为。
IndexError or ValueError
是一个计算结果为 IndexError
的表达式。匹配多个异常类型的语法是
except (IndexError, ValueError):