|
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 |
|
7 class 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 |
|
43 def 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 |
|
66 test() |