Workaround for OrderedDict bug: import from 'ordereddict' backport module if available
This commit is contained in:
parent
54ca31f91b
commit
b993c64c48
|
@ -15,74 +15,79 @@ import threading, sys, copy, collections
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
except:
|
except ImportError:
|
||||||
# Deprecated; this class is now present in Python 2.7 as collections.OrderedDict
|
# fallback: try to use the ordereddict backport when using python 2.6
|
||||||
# Only keeping this around for python2.6 support.
|
try:
|
||||||
class OrderedDict(dict):
|
from ordereddict import OrderedDict
|
||||||
"""extends dict so that elements are iterated in the order that they were added.
|
except ImportError:
|
||||||
Since this class can not be instantiated with regular dict notation, it instead uses
|
# backport not installed: use local OrderedDict
|
||||||
a list of tuples:
|
# Deprecated; this class is now present in Python 2.7 as collections.OrderedDict
|
||||||
od = OrderedDict([(key1, value1), (key2, value2), ...])
|
# Only keeping this around for python2.6 support.
|
||||||
items set using __setattr__ are added to the end of the key list.
|
class OrderedDict(dict):
|
||||||
"""
|
"""extends dict so that elements are iterated in the order that they were added.
|
||||||
|
Since this class can not be instantiated with regular dict notation, it instead uses
|
||||||
|
a list of tuples:
|
||||||
|
od = OrderedDict([(key1, value1), (key2, value2), ...])
|
||||||
|
items set using __setattr__ are added to the end of the key list.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, data=None):
|
def __init__(self, data=None):
|
||||||
self.order = []
|
self.order = []
|
||||||
if data is not None:
|
if data is not None:
|
||||||
for i in data:
|
for i in data:
|
||||||
self[i[0]] = i[1]
|
self[i[0]] = i[1]
|
||||||
|
|
||||||
def __setitem__(self, k, v):
|
def __setitem__(self, k, v):
|
||||||
if not self.has_key(k):
|
if not self.has_key(k):
|
||||||
self.order.append(k)
|
self.order.append(k)
|
||||||
dict.__setitem__(self, k, v)
|
dict.__setitem__(self, k, v)
|
||||||
|
|
||||||
def __delitem__(self, k):
|
def __delitem__(self, k):
|
||||||
self.order.remove(k)
|
self.order.remove(k)
|
||||||
dict.__delitem__(self, k)
|
dict.__delitem__(self, k)
|
||||||
|
|
||||||
def keys(self):
|
def keys(self):
|
||||||
return self.order[:]
|
return self.order[:]
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
it = []
|
it = []
|
||||||
for k in self.keys():
|
for k in self.keys():
|
||||||
it.append((k, self[k]))
|
it.append((k, self[k]))
|
||||||
return it
|
return it
|
||||||
|
|
||||||
def values(self):
|
def values(self):
|
||||||
return [self[k] for k in self.order]
|
return [self[k] for k in self.order]
|
||||||
|
|
||||||
def remove(self, key):
|
def remove(self, key):
|
||||||
del self[key]
|
del self[key]
|
||||||
#self.order.remove(key)
|
#self.order.remove(key)
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
for k in self.order:
|
for k in self.order:
|
||||||
yield k
|
yield k
|
||||||
|
|
||||||
def update(self, data):
|
def update(self, data):
|
||||||
"""Works like dict.update, but accepts list-of-tuples as well as dict."""
|
"""Works like dict.update, but accepts list-of-tuples as well as dict."""
|
||||||
if isinstance(data, dict):
|
if isinstance(data, dict):
|
||||||
for k, v in data.iteritems():
|
for k, v in data.iteritems():
|
||||||
self[k] = v
|
self[k] = v
|
||||||
else:
|
else:
|
||||||
for k,v in data:
|
for k,v in data:
|
||||||
self[k] = v
|
self[k] = v
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
return OrderedDict(self.items())
|
return OrderedDict(self.items())
|
||||||
|
|
||||||
def itervalues(self):
|
def itervalues(self):
|
||||||
for k in self.order:
|
for k in self.order:
|
||||||
yield self[k]
|
yield self[k]
|
||||||
|
|
||||||
def iteritems(self):
|
def iteritems(self):
|
||||||
for k in self.order:
|
for k in self.order:
|
||||||
yield (k, self[k])
|
yield (k, self[k])
|
||||||
|
|
||||||
def __deepcopy__(self, memo):
|
def __deepcopy__(self, memo):
|
||||||
return OrderedDict([(k, copy.deepcopy(v, memo)) for k, v in self.iteritems()])
|
return OrderedDict([(k, copy.deepcopy(v, memo)) for k, v in self.iteritems()])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user