# 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()
