python - Dict-like object with no __getitem__, __setitem__ -
if
import gdbm db = gdbm.open('foo', 'cs') you object is:
<gdbm.gdbm @ 0x7f0982b9aef0> you can set keys , values in database via:
db['foo'] = 'bar' print db['foo'] i wanted use these twisted , make wrapper __getitem__ , __setitem__ returns deferreds. however, noticed peculiar:
in [42]: dir(db) out[42]: ['close', 'firstkey', 'has_key', 'keys', 'nextkey', 'reorganize', 'sync'] this object hasn't got __getitem__ , __setitem__. trying either of these gives attribute access error. yet, behaves dictionary. sort of object this?
(i suspect c extension object, find odd has dict-like access methods, no __getitem__ , __setitem__ methods. pointer python doc describing behavior helpful.)
further: how references db.__getitem__ , db.__setitem__ if wanted wrap them in deferred? solution see wrap db in utility class:
class db: def __init__(self, db): self.db = db def __getitem__(self, x): return self.db[x] ... but perhaps missing obvious?
gdbm indeed c module; object implements c-api mapping protocol instead.
see source code pymappingmethods structure function pointers.
you use operator.getitem() access keys:
>>> operator import getitem >>> db['foo'] = 'bar' >>> getitem(db, 'foo') 'bar' you wrap getitem() in functools.partial() make efficient callable 1 argument:
>>> functools import partial >>> gi = partial(getitem, db) >>> gi('foo') 'bar' as getitem , partial implemented in c, combo faster custom objects, functions or lambdas wrap access.
Comments
Post a Comment