# A more or less complete user-defined wrapper around dictionary objects

class UserDict:
    def __init__(self): self.data = {}
    def __repr__(self): return repr(self.data)
    def __cmp__(self, dict):
        if type(dict) == type(self.data):
            return cmp(self.data, dict)
        else:
            return cmp(self.data, dict.data)
    def __len__(self): return len(self.data)
    def __getitem__(self, key): return self.data[key]
    def __setitem__(self, key, item): self.data[key] = item
    def __delitem__(self, key): del self.data[key]
    def clear(self): return self.data.clear()
    def copy(self):
        import copy
        return copy.copy(self)
    def keys(self): return self.data.keys()
    def items(self): return self.data.items()
    def values(self): return self.data.values()
    def has_key(self, key): return self.data.has_key(key)
    def update(self, other):
        if type(other) is type(self.data):
            self.data.update(other)
        else:
            for k, v in other.items():
                self.data[k] = v
    def get(self, key, failobj=None):
        if self.data.has_key(key):
            return self.data[key]
        else:
            return failobj
