I am trying to write a key value store in python using HDF5 as a backend. Ideally I would like the store to behave as a python dictionary. My current code looks like this now
from multimethod import multimethod
from typing import List
import h5py
class FancyDic(MutableMapping):
def __init__(self, fname):
self.fname = fname
self.__store__ = h5py.File(fname,'w')
def get_dic(self, df):
data_dict = dict()
for col in df.columns:
if "coord" in col:
pass
else:
data_dict[col] = df[col].values
return data_dict
@multimethod
def update(self:object, path:str, key:str, value:float):
self.__store__[path + key] = value
@update.register
def _(self:object, path:str, key:str, value:np.ndarray):
self.__store__[path + key] = value
@update.register
def _(self:object, path:str, key:str, value:list):
self.__store__[path + key] = np.asarray(value)
@update.register
def _(self:object, path:str, key:str, value:str):
self.__store__.attrs[path+key] = value
@update.register
def _(self:object, path:str, key:str, value:List[str]):
self.__store__[path + key] = np.array(value).astype('|S100')
@update.register
def _(self:object, path:str, key:str, value:dict):
for key, item in value.items():
key = str(key)
if isinstance(item, pandas.core.frame.DataFrame):
data_dic = self.get_dic(item)
self.update(path+"/"+key,"/",data_dic )
else:
self.update(path+"/"+key,"/",item )
def __openfile__(self, fname):
self.__store__ = h5py.File(fname,'r+')
def closefile(self):
self.__store__.close()
# The next five methods are requirements of the ABC.
def __setitem__(self,path, key, value):
self.update(path, key, value)
def __getitem__(self, key):
if isinstance(key, int):
key = str(key)
return self.__store__[key]
def __delitem__(self, key):
del self.__dict__[key]
def __iter__(self):
return iter(self.__dict__)
def __len__(self):
return len(self.__dict__)
# The final two methods aren't required, but nice for demo purposes:
def __str__(self):
'''returns simple dict representation of the mapping'''
return str(self.__dict__)
When i try to access an element it works for instance I can do FancyDicObj[key]
etc but when I do this it returns an HDF5 group object as expected which I can only access through string keys. I would like to be able to access the elements by integer keys as well. Is there a way to introduce a function so that subscriptable access by integer key is still possible in this key value store. For instance FancyDicObj[key][1]
instead of FancyDicObj[key]["1"]
even though I store the data in string representation of the numeric keys.