基于HDF5的Python键值存储实现整数键访问咨询
实现方案
核心问题是你当前直接返回了原生h5py.Group对象,它本身没有做整数键到字符串键的转换逻辑,所以需要对h5py返回的组、数据集对象做一层包装,在访问时自动处理键的类型转换。
步骤1:编写h5对象包装类
新增一个通用包装类,统一处理所有层级的键类型转换:
import h5py from collections.abc import MutableMapping class H5ObjectWrapper: def __init__(self, h5_obj): self._h5_obj = h5_obj def __getitem__(self, key): # 整数键自动转字符串 if isinstance(key, int): key = str(key) result = self._h5_obj[key] # 嵌套对象继续包装,保证多层访问也支持整数键 if isinstance(result, (h5py.Group, h5py.Dataset)): return H5ObjectWrapper(result) return result # 支持写入操作,可选 def __setitem__(self, key, value): if isinstance(key, int): key = str(key) self._h5_obj[key] = value # 支持删除操作,可选 def __delitem__(self, key): if isinstance(key, int): key = str(key) del self._h5_obj[key] # 透传迭代、长度统计等原生逻辑 def __iter__(self): return iter(self._h5_obj) def __len__(self): return len(self._h5_obj) # 透传h5对象原生属性和方法,比如.attrs、.keys()等 def __getattr__(self, name): return getattr(self._h5_obj, name)
步骤2:修改FancyDic的__getitem__逻辑
把返回的原生h5对象用包装类包裹后再返回:
def __getitem__(self, key): if isinstance(key, int): key = str(key) raw_h5_obj = self.__store__[key] return H5ObjectWrapper(raw_h5_obj)
可选:修复原类的已知问题
你当前的FancyDic实现有几处不符合MutableMapping规范的地方,建议同步修复:
__setitem__方法参数错误:MutableMapping要求__setitem__接收key和value两个参数,你当前写的三个参数会导致抽象类校验失败__delitem__、__iter__、__len__错误操作了实例本身的__dict__,应该操作底层的__store__存储对象
修复后参考代码:
def __setitem__(self, key, value): if isinstance(key, int): key = str(key) # 适配你原有update的参数逻辑,按业务需求调整路径即可 self.update("/", key, value) def __delitem__(self, key): if isinstance(key, int): key = str(key) del self.__store__[key] def __iter__(self): return iter(self.__store__) def __len__(self): return len(self.__store__)
效果验证
修改完成后即可直接用整数键访问嵌套层级:
fd = FancyDic("test.h5") # 假设已经存储了路径为/group_a/1的元素 print(fd["group_a"][1]) # 等价于原写法fd["group_a"]["1"]
内容的提问来源于stack exchange,提问作者arrhhh
相关产品推荐
相关产品推荐

