Author: aaugustin
Date: 2012-02-09 10:41:20 -0800 (Thu, 09 Feb 2012)
New Revision: 17464
Modified:
django/trunk/django/utils/datastructures.py
django/trunk/tests/regressiontests/utils/datastructures.py
Log:
Fixed #17634 -- Optimized the performance of MultiValueDict by using append
instead of copy and by minimizing the number of dict lookups. Refs #736.
Modified: django/trunk/django/utils/datastructures.py
===================================================================
--- django/trunk/django/utils/datastructures.py 2012-02-09 08:37:33 UTC (rev
17463)
+++ django/trunk/django/utils/datastructures.py 2012-02-09 18:41:20 UTC (rev
17464)
@@ -312,9 +312,9 @@
try:
return super(MultiValueDict, self).__getitem__(key)
except KeyError:
- if default is not None:
- return default
- return []
+ if default is None:
+ return []
+ return default
def setlist(self, key, list_):
super(MultiValueDict, self).__setitem__(key, list_)
@@ -322,17 +322,20 @@
def setdefault(self, key, default=None):
if key not in self:
self[key] = default
+ return default
return self[key]
- def setlistdefault(self, key, default_list=()):
+ def setlistdefault(self, key, default_list=None):
if key not in self:
+ if default_list is None:
+ default_list = []
self.setlist(key, default_list)
+ return default_list
return self.getlist(key)
def appendlist(self, key, value):
"""Appends an item to the internal list associated with key."""
- self.setlistdefault(key, [])
- super(MultiValueDict, self).__setitem__(key, self.getlist(key) +
[value])
+ self.setlistdefault(key).append(value)
def items(self):
"""
@@ -381,15 +384,15 @@
other_dict = args[0]
if isinstance(other_dict, MultiValueDict):
for key, value_list in other_dict.lists():
- self.setlistdefault(key, []).extend(value_list)
+ self.setlistdefault(key).extend(value_list)
else:
try:
for key, value in other_dict.items():
- self.setlistdefault(key, []).append(value)
+ self.setlistdefault(key).append(value)
except TypeError:
raise ValueError("MultiValueDict.update() takes either a
MultiValueDict or dictionary")
for key, value in kwargs.iteritems():
- self.setlistdefault(key, []).append(value)
+ self.setlistdefault(key).append(value)
def dict(self):
"""
Modified: django/trunk/tests/regressiontests/utils/datastructures.py
===================================================================
--- django/trunk/tests/regressiontests/utils/datastructures.py 2012-02-09
08:37:33 UTC (rev 17463)
+++ django/trunk/tests/regressiontests/utils/datastructures.py 2012-02-09
18:41:20 UTC (rev 17464)
@@ -206,6 +206,12 @@
self.assertEqual(list(d.itervalues()),
['Developer', 'Simon', 'Willison'])
+ def test_appendlist(self):
+ d = MultiValueDict()
+ d.appendlist('name', 'Adrian')
+ d.appendlist('name', 'Simon')
+ self.assertEqual(d.getlist('name'), ['Adrian', 'Simon'])
+
def test_copy(self):
for copy_func in [copy.copy, lambda d: d.copy()]:
d1 = MultiValueDict({
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.