Kaydet (Commit) 0aa12da0 authored tarafından Russell Keith-Magee's avatar Russell Keith-Magee

Fixed #12476 -- Forced the rollout of generators passed to SortedDict so that…

Fixed #12476 -- Forced the rollout of generators passed to SortedDict so that the data source can be read twice. Thanks to gsf for the report, and Alex for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12064 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst f45ac2ff
from types import GeneratorType
from django.utils.copycompat import deepcopy from django.utils.copycompat import deepcopy
...@@ -65,6 +67,11 @@ class SortedDict(dict): ...@@ -65,6 +67,11 @@ class SortedDict(dict):
def __init__(self, data=None): def __init__(self, data=None):
if data is None: if data is None:
data = {} data = {}
elif isinstance(data, GeneratorType):
# Unfortunately we need to be able to read a generator twice. Once
# to get the data into self with our super().__init__ call and a
# second time to setup keyOrder correctly
data = list(data)
super(SortedDict, self).__init__(data) super(SortedDict, self).__init__(data)
if isinstance(data, dict): if isinstance(data, dict):
self.keyOrder = data.keys() self.keyOrder = data.keys()
......
...@@ -60,9 +60,9 @@ MultiValueDictKeyError: "Key 'lastname' not found in <MultiValueDict: {'position ...@@ -60,9 +60,9 @@ MultiValueDictKeyError: "Key 'lastname' not found in <MultiValueDict: {'position
>>> d.setlist('lastname', ['Holovaty', 'Willison']) >>> d.setlist('lastname', ['Holovaty', 'Willison'])
>>> d.getlist('lastname') >>> d.getlist('lastname')
['Holovaty', 'Willison'] ['Holovaty', 'Willison']
>>> d.values() >>> d.values()
['Developer', 'Simon', 'Willison'] ['Developer', 'Simon', 'Willison']
>>> list(d.itervalues()) >>> list(d.itervalues())
['Developer', 'Simon', 'Willison'] ['Developer', 'Simon', 'Willison']
### SortedDict ################################################################# ### SortedDict #################################################################
...@@ -95,6 +95,9 @@ True ...@@ -95,6 +95,9 @@ True
>>> d.pop('one', 'missing') >>> d.pop('one', 'missing')
'missing' 'missing'
>>> SortedDict((i, i) for i in xrange(3))
{0: 0, 1: 1, 2: 2}
We don't know which item will be popped in popitem(), so we'll just check that We don't know which item will be popped in popitem(), so we'll just check that
the number of keys has decreased. the number of keys has decreased.
>>> l = len(d) >>> l = len(d)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment