]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/Demo/classes/Dbm.py
Inital import
[l4.git] / l4 / pkg / python / contrib / Demo / classes / Dbm.py
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()