Fixed #5183 -- Added __deepcopy__, pop() and popitem() to SortedDict. Based on
a patch from David Blewett. git-svn-id: http://code.djangoproject.com/svn/django/trunk@6593 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
375a6d78cb
commit
dbd1cb9083
|
@ -62,6 +62,13 @@ class SortedDict(dict):
|
||||||
else:
|
else:
|
||||||
self.keyOrder = [key for key, value in data]
|
self.keyOrder = [key for key, value in data]
|
||||||
|
|
||||||
|
def __deepcopy__(self,memo):
|
||||||
|
from copy import deepcopy
|
||||||
|
obj = self.__class__()
|
||||||
|
for k, v in self.items():
|
||||||
|
obj[k] = deepcopy(v, memo)
|
||||||
|
return obj
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
dict.__setitem__(self, key, value)
|
dict.__setitem__(self, key, value)
|
||||||
if key not in self.keyOrder:
|
if key not in self.keyOrder:
|
||||||
|
@ -75,6 +82,20 @@ class SortedDict(dict):
|
||||||
for k in self.keyOrder:
|
for k in self.keyOrder:
|
||||||
yield k
|
yield k
|
||||||
|
|
||||||
|
def pop(self, k, *args):
|
||||||
|
result = dict.pop(self, k, *args)
|
||||||
|
try:
|
||||||
|
self.keyOrder.remove(k)
|
||||||
|
except ValueError:
|
||||||
|
# Key wasn't in the dictionary in the first place. No problem.
|
||||||
|
pass
|
||||||
|
return result
|
||||||
|
|
||||||
|
def popitem(self):
|
||||||
|
result = dict.popitem(self)
|
||||||
|
self.keyOrder.remove(result[0])
|
||||||
|
return result
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
return zip(self.keyOrder, self.values())
|
return zip(self.keyOrder, self.values())
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,17 @@
|
||||||
True
|
True
|
||||||
>>> print repr(d)
|
>>> print repr(d)
|
||||||
{'one': 'not one', 'two': 'two', 'three': 'three'}
|
{'one': 'not one', 'two': 'two', 'three': 'three'}
|
||||||
|
>>> d.pop('one', 'missing')
|
||||||
|
'not one'
|
||||||
|
>>> d.pop('one', 'missing')
|
||||||
|
'missing'
|
||||||
|
|
||||||
|
We don't know which item will be popped in popitem(), so we'll just check that
|
||||||
|
the number of keys has decreased.
|
||||||
|
>>> l = len(d)
|
||||||
|
>>> _ = d.popitem()
|
||||||
|
>>> l - len(d)
|
||||||
|
1
|
||||||
|
|
||||||
Init from sequence of tuples
|
Init from sequence of tuples
|
||||||
>>> d = SortedDict((
|
>>> d = SortedDict((
|
||||||
|
|
Loading…
Reference in New Issue