def __getitem__(self,key): SHMOBJ.protect(self) if isinstance(key, SHMSTR): key = str(key) if not isinstance(key, str): raise TypeError("** error: SHMDCT.__getitem__ only takes SHMSTR or str for key") np = py2shmobj.shmdict_lookup(self.addr, key) if not np: raise KeyError(key) else: (ep,datatype,datalen) = py2shmobj.shmdnode_get(np) return typed_ptr(ep,datatype)
def __setitem__(self,key,arg): SHMOBJ.protect(self) if not type(key) in [str, SHMSTR]: raise TypeError("** error: SHMDCT.__setitem__ only takes SHMSTR or str for key") if not isinstance(arg, SHMOBJ): raise TypeError("** invalid type being set in shmdict") datatype, datalen = get_type_and_len(arg) np = py2shmobj.shmdict_lookup(self.addr, str(key)) if np: py2shmobj.shmdnode_put(np,arg.get_ptr(),datatype,datalen) else: if not isinstance(key, SHMSTR): raise TypeError("** error: SHMDCT.__setitem__ only takes SHMSTR when key is new") dnode = py2shmobj.shmdnode_alloc() if dnode is None: raise Exception('shmdnode_alloc failed: out of memory') py2shmobj.shmdnode_init(dnode, arg.get_ptr(), datatype, datalen) py2shmobj.shmdict_insert(self.addr, dnode, key.get_ptr())
def pop(self, key, defval=None, deletekey=True): SHMOBJ.protect(self) if isinstance(key, SHMSTR): key = str(key) if not isinstance(key, str): raise TypeError("** error: SHMDCT.pop only takes SHMSTR or str for key") np = py2shmobj.shmdict_lookup(self.addr, key) if np: kp = py2shmobj.shmdnode_getkey(np) (ep,datatype,datalen) = py2shmobj.shmdnode_get(np) py2shmobj.shmdict_remove(self.addr, np) py2shmobj.shmobj_del(np) if deletekey == True: py2shmobj.shmobj_del(kp) return typed_ptr(ep,datatype) if defval: return defval else: raise KeyError(key)