diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py index 06cf6c6b75b..adcc3546d0a 100644 --- a/django/utils/datastructures.py +++ b/django/utils/datastructures.py @@ -1,3 +1,5 @@ +from types import GeneratorType + from django.utils.copycompat import deepcopy @@ -65,6 +67,11 @@ class SortedDict(dict): def __init__(self, data=None): if data is None: 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) if isinstance(data, dict): self.keyOrder = data.keys() diff --git a/tests/regressiontests/datastructures/tests.py b/tests/regressiontests/datastructures/tests.py index e658f3302e0..b7885e65a4c 100644 --- a/tests/regressiontests/datastructures/tests.py +++ b/tests/regressiontests/datastructures/tests.py @@ -60,9 +60,9 @@ MultiValueDictKeyError: "Key 'lastname' not found in >> d.setlist('lastname', ['Holovaty', 'Willison']) >>> d.getlist('lastname') ['Holovaty', 'Willison'] ->>> d.values() +>>> d.values() ['Developer', 'Simon', 'Willison'] ->>> list(d.itervalues()) +>>> list(d.itervalues()) ['Developer', 'Simon', 'Willison'] ### SortedDict ################################################################# @@ -95,6 +95,9 @@ True >>> d.pop('one', '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 the number of keys has decreased. >>> l = len(d)