summaryrefslogtreecommitdiff
path: root/django/utils/datastructures.py
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2012-11-11 00:35:46 +0200
committerAnssi Kääriäinen <akaariai@gmail.com>2012-11-13 22:48:25 +0200
commitfa18b0ac89723f4ed6e46e744039bf375c8945a5 (patch)
tree09332f7806752c4a2026a2534f88b6ad56558b29 /django/utils/datastructures.py
parent00ff69a827b38054afe557fc7d0a589b270ed871 (diff)
downloaddjango-fa18b0ac89723f4ed6e46e744039bf375c8945a5.tar.gz
Some changes to SortedDict to make it faster under py2
Refs #19276
Diffstat (limited to 'django/utils/datastructures.py')
-rw-r--r--django/utils/datastructures.py33
1 files changed, 14 insertions, 19 deletions
diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py
index d94a05dfb4..f81fb88a19 100644
--- a/django/utils/datastructures.py
+++ b/django/utils/datastructures.py
@@ -1,6 +1,5 @@
import copy
import warnings
-from types import GeneratorType
from django.utils import six
@@ -120,27 +119,23 @@ class SortedDict(dict):
return instance
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 = list(data)
+ if data is None or isinstance(data, dict):
+ data = data or []
+ super(SortedDict, self).__init__(data)
+ self.keyOrder = list(data) if data else []
else:
- self.keyOrder = []
- seen = set()
+ super(SortedDict, self).__init__()
+ super_set = super(SortedDict, self).__setitem__
for key, value in data:
- if key not in seen:
+ # Take the ordering from first key
+ if key not in self:
self.keyOrder.append(key)
- seen.add(key)
+ # But override with last value in data (dict() does this)
+ super_set(key, value)
def __deepcopy__(self, memo):
return self.__class__([(key, copy.deepcopy(value, memo))
- for key, value in six.iteritems(self)])
+ for key, value in self.items()])
def __copy__(self):
# The Python's default copy implementation will alter the state
@@ -199,13 +194,13 @@ class SortedDict(dict):
itervalues = _itervalues
def items(self):
- return list(self.iteritems())
+ return [(k, self[k]) for k in self.keyOrder]
def keys(self):
- return list(self.iterkeys())
+ return self.keyOrder[:]
def values(self):
- return list(self.itervalues())
+ return [self[k] for k in self.keyOrder]
def update(self, dict_):
for k, v in six.iteritems(dict_):