]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Merged OrderedDict fixes from r2843 (0.4)
authorJason Kirtland <jek@discorporate.us>
Tue, 3 Jul 2007 04:41:01 +0000 (04:41 +0000)
committerJason Kirtland <jek@discorporate.us>
Tue, 3 Jul 2007 04:41:01 +0000 (04:41 +0000)
lib/sqlalchemy/util.py

index 0d66080ac2bd5bbdb48c74634e2da44f78e54724..c827f1e7d663a0868c7c70125b90ef3c2c73c67e 100644 (file)
@@ -238,24 +238,23 @@ class OrderedDict(dict):
 
     def __init__(self, d=None, **kwargs):
         self._list = []
-        self.update(d, **kwargs)
-
-    def keys(self):
-        return list(self._list)
+        if d is None:
+            self.update(**kwargs)
+        else:
+            self.update(d, **kwargs)
 
     def clear(self):
         self._list = []
         dict.clear(self)
 
-    def update(self, d=None, **kwargs):
-        # d can be a dict or sequence of keys/values
-        if d:
-            if hasattr(d, 'iteritems'):
-                seq = d.iteritems()
+    def update(self, ____sequence=None, **kwargs):
+        if ____sequence is not None:
+            if hasattr(____sequence, 'keys'):
+                for key in ____sequence.keys():
+                    self.__setitem__(key, ____sequence[key])
             else:
-                seq = d
-            for key, value in seq:
-                self.__setitem__(key, value)
+                for key, value in ____sequence:
+                    self[key] = value
         if kwargs:
             self.update(kwargs)
 
@@ -266,35 +265,45 @@ class OrderedDict(dict):
         else:
             return self.__getitem__(key)
 
-    def values(self):
-        return [self[key] for key in self._list]
-
     def __iter__(self):
         return iter(self._list)
 
+    def values(self):
+        return [self[key] for key in self._list]
+
     def itervalues(self):
-        return iter([self[key] for key in self._list])
+        return iter(self.values())
+
+    def keys(self):
+        return list(self._list)
 
     def iterkeys(self):
-        return self.__iter__()
+        return iter(self.keys())
 
-    def iteritems(self):
-        return iter([(key, self[key]) for key in self.keys()])
+    def items(self):
+        return [(key, self[key]) for key in self.keys()]
 
-    def __delitem__(self, key):
-        try:
-            del self._list[self._list.index(key)]
-        except ValueError:
-            raise KeyError(key)
-        dict.__delitem__(self, key)
+    def iteritems(self):
+        return iter(self.items())
 
     def __setitem__(self, key, object):
         if not self.has_key(key):
             self._list.append(key)
         dict.__setitem__(self, key, object)
 
-    def __getitem__(self, key):
-        return dict.__getitem__(self, key)
+    def __delitem__(self, key):
+        dict.__delitem__(self, key)
+        self._list.remove(key)
+
+    def pop(self, key):
+        value = dict.pop(self, key)
+        self._list.remove(key)
+        return value
+
+    def popitem(self):
+        item = dict.popitem(self)
+        self._list.remove(item[0])
+        return item
 
 class ThreadLocal(object):
     """An object in which attribute access occurs only within the context of the current thread."""