1 """A more or less complete user-defined wrapper around dictionary objects."""
4 def __init__(self
, dict=None, **kwargs
):
7 if not hasattr(dict,'keys'):
8 dict = type({})(dict) # make mapping from a sequence
12 def __repr__(self
): return repr(self
.data
)
13 def __cmp__(self
, dict):
14 if isinstance(dict, UserDict
):
15 return cmp(self
.data
, dict.data
)
17 return cmp(self
.data
, dict)
18 def __len__(self
): return len(self
.data
)
19 def __getitem__(self
, key
): return self
.data
[key
]
20 def __setitem__(self
, key
, item
): self
.data
[key
] = item
21 def __delitem__(self
, key
): del self
.data
[key
]
22 def clear(self
): self
.data
.clear()
24 if self
.__class
__ is UserDict
:
25 return UserDict(self
.data
)
35 def keys(self
): return self
.data
.keys()
36 def items(self
): return self
.data
.items()
37 def iteritems(self
): return self
.data
.iteritems()
38 def iterkeys(self
): return self
.data
.iterkeys()
39 def itervalues(self
): return self
.data
.itervalues()
40 def values(self
): return self
.data
.values()
41 def has_key(self
, key
): return self
.data
.has_key(key
)
42 def update(self
, dict):
43 if isinstance(dict, UserDict
):
44 self
.data
.update(dict.data
)
45 elif isinstance(dict, type(self
.data
)):
46 self
.data
.update(dict)
48 for k
, v
in dict.items():
50 def get(self
, key
, failobj
=None):
51 if not self
.has_key(key
):
54 def setdefault(self
, key
, failobj
=None):
55 if not self
.has_key(key
):
59 return self
.data
.pop(key
)
61 return self
.data
.popitem()
62 def __contains__(self
, key
):
63 return key
in self
.data
64 def fromkeys(cls
, iterable
, value
=None):
69 fromkeys
= classmethod(fromkeys
)
71 class IterableUserDict(UserDict
):
73 return iter(self
.data
)
76 # Mixin defining all dictionary methods for classes that already have
77 # a minimum dictionary interface including getitem, setitem, delitem,
78 # and keys. Without knowledge of the subclass constructor, the mixin
79 # does not define __init__() or copy(). In addition to the four base
80 # methods, progessively more efficiency comes with defining
81 # __contains__(), __iter__(), and iteritems().
83 # second level definitions support higher levels
87 def has_key(self
, key
):
93 __contains__
= has_key
95 # third level takes advantage of second level definitions
101 # fourth level uses definitions from lower levels
102 def itervalues(self
):
103 for _
, v
in self
.iteritems():
106 return [v
for _
, v
in self
.iteritems()]
108 return list(self
.iteritems())
110 for key
in self
.keys():
112 def setdefault(self
, key
, default
):
124 k
, v
= self
.iteritems().next()
125 except StopIteration:
126 raise KeyError, 'container is empty'
129 def update(self
, other
):
130 # Make progressively weaker assumptions about "other"
131 if hasattr(other
, 'iteritems'): # iteritems saves memory and lookups
132 for k
, v
in other
.iteritems():
134 elif hasattr(other
, '__iter__'): # iter saves memory
138 for k
in other
.keys():
140 def get(self
, key
, default
=None):
146 return repr(dict(self
.iteritems()))
147 def __cmp__(self
, other
):
148 if isinstance(other
, DictMixin
):
149 other
= dict(other
.iteritems())
150 return cmp(dict(self
.iteritems()), other
)
152 return len(self
.keys())