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.
 
    