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.

Reply via email to