# A wrapper around the (optional) built-in class dbm, supporting keys | |
# and values of almost any type instead of just string. | |
# (Actually, this works only for keys and values that can be read back | |
# correctly after being converted to a string.) | |
class Dbm: | |
def __init__(self, filename, mode, perm): | |
import dbm | |
self.db = dbm.open(filename, mode, perm) | |
def __repr__(self): | |
s = '' | |
for key in self.keys(): | |
t = repr(key) + ': ' + repr(self[key]) | |
if s: t = ', ' + t | |
s = s + t | |
return '{' + s + '}' | |
def __len__(self): | |
return len(self.db) | |
def __getitem__(self, key): | |
return eval(self.db[repr(key)]) | |
def __setitem__(self, key, value): | |
self.db[repr(key)] = repr(value) | |
def __delitem__(self, key): | |
del self.db[repr(key)] | |
def keys(self): | |
res = [] | |
for key in self.db.keys(): | |
res.append(eval(key)) | |
return res | |
def has_key(self, key): | |
return self.db.has_key(repr(key)) | |
def test(): | |
d = Dbm('@dbm', 'rw', 0600) | |
print d | |
while 1: | |
try: | |
key = input('key: ') | |
if d.has_key(key): | |
value = d[key] | |
print 'currently:', value | |
value = input('value: ') | |
if value is None: | |
del d[key] | |
else: | |
d[key] = value | |
except KeyboardInterrupt: | |
print '' | |
print d | |
except EOFError: | |
print '[eof]' | |
break | |
print d | |
test() |