From 15dd1e7947b966dafa72cb4989a1471a319a74dc Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Tue, 3 Jul 2007 04:41:01 +0000 Subject: [PATCH] Merged OrderedDict fixes from r2843 (0.4) --- lib/sqlalchemy/util.py | 63 ++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 0d66080ac2..c827f1e7d6 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -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.""" -- 2.47.2