diff options
author | Anssi Kääriäinen <akaariai@gmail.com> | 2012-11-11 00:35:46 +0200 |
---|---|---|
committer | Anssi Kääriäinen <akaariai@gmail.com> | 2012-11-13 22:48:25 +0200 |
commit | fa18b0ac89723f4ed6e46e744039bf375c8945a5 (patch) | |
tree | 09332f7806752c4a2026a2534f88b6ad56558b29 /django/utils/datastructures.py | |
parent | 00ff69a827b38054afe557fc7d0a589b270ed871 (diff) | |
download | django-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.py | 33 |
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_): |