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