1# A wrapper around the (optional) built-in class dbm, supporting keys 2# and values of almost any type instead of just string. 3# (Actually, this works only for keys and values that can be read back 4# correctly after being converted to a string.) 5 6 7class Dbm: 8 9 def __init__(self, filename, mode, perm): 10 import dbm 11 self.db = dbm.open(filename, mode, perm) 12 13 def __repr__(self): 14 s = '' 15 for key in self.keys(): 16 t = repr(key) + ': ' + repr(self[key]) 17 if s: t = ', ' + t 18 s = s + t 19 return '{' + s + '}' 20 21 def __len__(self): 22 return len(self.db) 23 24 def __getitem__(self, key): 25 return eval(self.db[repr(key)]) 26 27 def __setitem__(self, key, value): 28 self.db[repr(key)] = repr(value) 29 30 def __delitem__(self, key): 31 del self.db[repr(key)] 32 33 def keys(self): 34 res = [] 35 for key in self.db.keys(): 36 res.append(eval(key)) 37 return res 38 39 def has_key(self, key): 40 return self.db.has_key(repr(key)) 41 42 43def test(): 44 d = Dbm('@dbm', 'rw', 0600) 45 print d 46 while 1: 47 try: 48 key = input('key: ') 49 if d.has_key(key): 50 value = d[key] 51 print 'currently:', value 52 value = input('value: ') 53 if value is None: 54 del d[key] 55 else: 56 d[key] = value 57 except KeyboardInterrupt: 58 print '' 59 print d 60 except EOFError: 61 print '[eof]' 62 break 63 print d 64 65 66test() 67