|
13 | 13 | from itertools import repeat as _repeat, chain as _chain, starmap as _starmap, \ |
14 | 14 | ifilter as _ifilter, imap as _imap |
15 | 15 | try: |
16 | | - from thread import get_ident |
| 16 | + from thread import get_ident as _get_ident |
17 | 17 | except ImportError: |
18 | | - from dummy_thread import get_ident |
19 | | - |
20 | | -def _recursive_repr(user_function): |
21 | | - 'Decorator to make a repr function return "..." for a recursive call' |
22 | | - repr_running = set() |
23 | | - |
24 | | - def wrapper(self): |
25 | | - key = id(self), get_ident() |
26 | | - if key in repr_running: |
27 | | - return '...' |
28 | | - repr_running.add(key) |
29 | | - try: |
30 | | - result = user_function(self) |
31 | | - finally: |
32 | | - repr_running.discard(key) |
33 | | - return result |
34 | | - |
35 | | - # Can't use functools.wraps() here because of bootstrap issues |
36 | | - wrapper.__module__ = getattr(user_function, '__module__') |
37 | | - wrapper.__doc__ = getattr(user_function, '__doc__') |
38 | | - wrapper.__name__ = getattr(user_function, '__name__') |
39 | | - return wrapper |
| 18 | + from dummy_thread import get_ident as _get_ident |
40 | 19 |
|
41 | 20 |
|
42 | 21 | ################################################################################ |
@@ -123,14 +102,37 @@ def clear(self): |
123 | 102 | pass |
124 | 103 | dict.clear(self) |
125 | 104 |
|
126 | | - update = __update = MutableMapping.update |
127 | | - keys = MutableMapping.keys |
128 | | - values = MutableMapping.values |
129 | | - items = MutableMapping.items |
130 | | - iterkeys = MutableMapping.iterkeys |
131 | | - itervalues = MutableMapping.itervalues |
132 | | - iteritems = MutableMapping.iteritems |
133 | | - __ne__ = MutableMapping.__ne__ |
| 105 | + # -- the following methods do not depend on the internal structure -- |
| 106 | + |
| 107 | + def keys(self): |
| 108 | + 'od.keys() -> list of keys in od' |
| 109 | + return list(self) |
| 110 | + |
| 111 | + def values(self): |
| 112 | + 'od.values() -> list of values in od' |
| 113 | + return [self[key] for key in self] |
| 114 | + |
| 115 | + def items(self): |
| 116 | + 'od.items() -> list of (key, value) pairs in od' |
| 117 | + return [(key, self[key]) for key in self] |
| 118 | + |
| 119 | + def iterkeys(self): |
| 120 | + 'od.iterkeys() -> an iterator over the keys in od' |
| 121 | + return iter(self) |
| 122 | + |
| 123 | + def itervalues(self): |
| 124 | + 'od.itervalues -> an iterator over the values in od' |
| 125 | + for k in self: |
| 126 | + yield self[k] |
| 127 | + |
| 128 | + def iteritems(self): |
| 129 | + 'od.iteritems -> an iterator over the (key, value) items in od' |
| 130 | + for k in self: |
| 131 | + yield (k, self[k]) |
| 132 | + |
| 133 | + update = MutableMapping.update |
| 134 | + |
| 135 | + __update = update # let subclasses override update without breaking __init__ |
134 | 136 |
|
135 | 137 | def viewkeys(self): |
136 | 138 | "od.viewkeys() -> a set-like object providing a view on od's keys" |
@@ -173,12 +175,18 @@ def popitem(self, last=True): |
173 | 175 | value = self.pop(key) |
174 | 176 | return key, value |
175 | 177 |
|
176 | | - @_recursive_repr |
177 | | - def __repr__(self): |
| 178 | + def __repr__(self, _repr_running={}): |
178 | 179 | 'od.__repr__() <==> repr(od)' |
179 | | - if not self: |
180 | | - return '%s()' % (self.__class__.__name__,) |
181 | | - return '%s(%r)' % (self.__class__.__name__, self.items()) |
| 180 | + call_key = id(self), _get_ident() |
| 181 | + if call_key in _repr_running: |
| 182 | + return '...' |
| 183 | + _repr_running[call_key] = 1 |
| 184 | + try: |
| 185 | + if not self: |
| 186 | + return '%s()' % (self.__class__.__name__,) |
| 187 | + return '%s(%r)' % (self.__class__.__name__, self.items()) |
| 188 | + finally: |
| 189 | + del _repr_running[call_key] |
182 | 190 |
|
183 | 191 | def __reduce__(self): |
184 | 192 | 'Return state information for pickling' |
@@ -211,10 +219,13 @@ def __eq__(self, other): |
211 | 219 |
|
212 | 220 | ''' |
213 | 221 | if isinstance(other, OrderedDict): |
214 | | - return len(self)==len(other) and \ |
215 | | - all(_imap(_eq, self.iteritems(), other.iteritems())) |
| 222 | + return len(self)==len(other) and self.items() == other.items() |
216 | 223 | return dict.__eq__(self, other) |
217 | 224 |
|
| 225 | + def __ne__(self, other): |
| 226 | + 'od.__ne__(y) <==> od!=y' |
| 227 | + return not self == other |
| 228 | + |
218 | 229 |
|
219 | 230 | ################################################################################ |
220 | 231 | ### namedtuple |
|
0 commit comments