Przeglądaj źródła

OrderedDict now passes tests in Python 2.5

Ask Solem 15 lat temu
rodzic
commit
53f5f08f85
1 zmienionych plików z 57 dodań i 12 usunięć
  1. 57 12
      celery/utils/compat.py

+ 57 - 12
celery/utils/compat.py

@@ -60,6 +60,8 @@ class OrderedDict(dict, MutableMapping):
     # Those hard references disappear when a key is deleted from
     # an OrderedDict.
 
+    __marker = object()
+
     def __init__(self, *args, **kwds):
         """Initialize an ordered dictionary.
 
@@ -132,23 +134,63 @@ class OrderedDict(dict, MutableMapping):
         """Return state information for pickling"""
         items = [[k, self[k]] for k in self]
         tmp = self.__map, self.__root
-        del self.__map, self.__root
+        del(self.__map, self.__root)
         inst_dict = vars(self).copy()
         self.__map, self.__root = tmp
         if inst_dict:
             return (self.__class__, (items,), inst_dict)
         return self.__class__, (items,)
 
-    setdefault = MutableMapping.setdefault
-    update = MutableMapping.update
-    pop = MutableMapping.pop
-    keys = MutableMapping.keys
-    values = MutableMapping.values
-    items = MutableMapping.items
-    iterkeys = MutableMapping.iterkeys
-    itervalues = MutableMapping.itervalues
-    iteritems = MutableMapping.iteritems
-    __ne__ = MutableMapping.__ne__
+    def setdefault(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            self[key] = default
+        return default
+
+    def update(self, other=(), **kwds):
+        if isinstance(other, dict):
+            for key in other:
+                self[key] = other[key]
+        elif hasattr(other, "keys"):
+            for key in other.keys():
+                self[key] = other[key]
+        else:
+            for key, value in other:
+                self[key] = value
+        for key, value in kwds.items():
+            self[key] = value
+
+    def pop(self, key, default=__marker):
+        try:
+            value = self[key]
+        except KeyError:
+            if default is self.__marker:
+                raise
+            return default
+        else:
+            del self[key]
+            return value
+
+    def values(self):
+        return [self[key] for key in self]
+
+    def items(self):
+        return [(key, self[key]) for key in self]
+
+    def itervalues(self):
+        for key in self:
+            yield self[key]
+
+    def iteritems(self):
+        for key in self:
+            yield (key, self[key])
+
+    def iterkeys(self):
+        return iter(self)
+
+    def keys(self):
+        return list(self)
 
     def popitem(self, last=True):
         """od.popitem() -> (k, v)
@@ -160,7 +202,7 @@ class OrderedDict(dict, MutableMapping):
         """
         if not self:
             raise KeyError('dictionary is empty')
-        key = next(reversed(self) if last else iter(self))
+        key = (last and reversed(self) or iter(self)).next()
         value = self.pop(key)
         return key, value
 
@@ -192,6 +234,9 @@ class OrderedDict(dict, MutableMapping):
                    all(_imap(_eq, self.iteritems(), other.iteritems()))
         return dict.__eq__(self, other)
 
+    def __ne__(self, other):
+        return not (self == other)
+
 ############## defaultdict ##################################################
 
 try: