Commit 0bbe7379 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

[1.3.X] Fixed #17634 -- Optimized the performance of MultiValueDict by using...

[1.3.X] Fixed #17634 -- Optimized the performance of MultiValueDict by using append instead of copy and by minimizing the number of dict lookups. Backport of r17464 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.3.X@17807 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 15fb61c6
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -319,17 +319,20 @@ class MultiValueDict(dict):
    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):
        """
@@ -378,15 +381,15 @@ class MultiValueDict(dict):
            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)

class DotExpandedDict(dict):
    """
+6 −0
Original line number Diff line number Diff line
@@ -212,6 +212,12 @@ class MultiValueDictTests(DatastructuresTestCase):
        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, lambda d: d.copy()]:
            d1 = MultiValueDict({