Skip to content

Commit 8f00286

Browse files
committed
Cleaned up the QueryDict implementation.
- Use super(). - Don't poke at internals. - Don't override methods for no reason.
1 parent 9a25d86 commit 8f00286

File tree

3 files changed

+18
-30
lines changed

3 files changed

+18
-30
lines changed

django/http/__init__.py

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import absolute_import, unicode_literals
22

3+
import copy
34
import datetime
45
import os
56
import re
@@ -360,6 +361,7 @@ def xreadlines(self):
360361
def readlines(self):
361362
return list(iter(self))
362363

364+
363365
class QueryDict(MultiValueDict):
364366
"""
365367
A specialized MultiValueDict that takes a query string when initialized.
@@ -374,7 +376,7 @@ class QueryDict(MultiValueDict):
374376
_encoding = None
375377

376378
def __init__(self, query_string, mutable=False, encoding=None):
377-
MultiValueDict.__init__(self)
379+
super(QueryDict, self).__init__()
378380
if not encoding:
379381
encoding = settings.DEFAULT_CHARSET
380382
self.encoding = encoding
@@ -401,72 +403,58 @@ def __setitem__(self, key, value):
401403
self._assert_mutable()
402404
key = str_to_unicode(key, self.encoding)
403405
value = str_to_unicode(value, self.encoding)
404-
MultiValueDict.__setitem__(self, key, value)
406+
super(QueryDict, self).__setitem__(key, value)
405407

406408
def __delitem__(self, key):
407409
self._assert_mutable()
408410
super(QueryDict, self).__delitem__(key)
409411

410412
def __copy__(self):
411413
result = self.__class__('', mutable=True, encoding=self.encoding)
412-
for key, value in dict.items(self):
413-
dict.__setitem__(result, key, value)
414+
for key, value in self.iterlists():
415+
result.setlist(key, value)
414416
return result
415417

416418
def __deepcopy__(self, memo):
417-
import copy
418419
result = self.__class__('', mutable=True, encoding=self.encoding)
419420
memo[id(self)] = result
420-
for key, value in dict.items(self):
421-
dict.__setitem__(result, copy.deepcopy(key, memo), copy.deepcopy(value, memo))
421+
for key, value in self.iterlists():
422+
result.setlist(copy.deepcopy(key, memo), copy.deepcopy(value, memo))
422423
return result
423424

424425
def setlist(self, key, list_):
425426
self._assert_mutable()
426427
key = str_to_unicode(key, self.encoding)
427428
list_ = [str_to_unicode(elt, self.encoding) for elt in list_]
428-
MultiValueDict.setlist(self, key, list_)
429+
super(QueryDict, self).setlist(key, list_)
429430

430-
def setlistdefault(self, key, default_list=()):
431+
def setlistdefault(self, key, default_list=None):
431432
self._assert_mutable()
432-
if key not in self:
433-
self.setlist(key, default_list)
434-
return MultiValueDict.getlist(self, key)
433+
return super(QueryDict, self).setlistdefault(key, default_list)
435434

436435
def appendlist(self, key, value):
437436
self._assert_mutable()
438437
key = str_to_unicode(key, self.encoding)
439438
value = str_to_unicode(value, self.encoding)
440-
MultiValueDict.appendlist(self, key, value)
441-
442-
def update(self, other_dict):
443-
self._assert_mutable()
444-
f = lambda s: str_to_unicode(s, self.encoding)
445-
if hasattr(other_dict, 'lists'):
446-
for key, valuelist in other_dict.lists():
447-
for value in valuelist:
448-
MultiValueDict.update(self, {f(key): f(value)})
449-
else:
450-
d = dict([(f(k), f(v)) for k, v in other_dict.items()])
451-
MultiValueDict.update(self, d)
439+
super(QueryDict, self).appendlist(key, value)
452440

453441
def pop(self, key, *args):
454442
self._assert_mutable()
455-
return MultiValueDict.pop(self, key, *args)
443+
return super(QueryDict, self).pop(key, *args)
456444

457445
def popitem(self):
458446
self._assert_mutable()
459-
return MultiValueDict.popitem(self)
447+
return super(QueryDict, self).popitem()
460448

461449
def clear(self):
462450
self._assert_mutable()
463-
MultiValueDict.clear(self)
451+
super(QueryDict, self).clear()
464452

465453
def setdefault(self, key, default=None):
466454
self._assert_mutable()
467455
key = str_to_unicode(key, self.encoding)
468456
default = str_to_unicode(default, self.encoding)
469-
return MultiValueDict.setdefault(self, key, default)
457+
return super(QueryDict, self).setdefault(key, default)
470458

471459
def copy(self):
472460
"""Returns a mutable copy of this object."""
@@ -499,6 +487,7 @@ def urlencode(self, safe=None):
499487
for v in list_])
500488
return '&'.join(output)
501489

490+
502491
def parse_cookie(cookie):
503492
if cookie == '':
504493
return {}

django/utils/datastructures.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,6 @@ def setlistdefault(self, key, default_list=None):
334334
if default_list is None:
335335
default_list = []
336336
self.setlist(key, default_list)
337-
return default_list
338337
return self.getlist(key)
339338

340339
def appendlist(self, key, value):

tests/regressiontests/httpwrappers/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def test_pickle(self):
189189
self.assertEqual(q == q1, True)
190190
q = QueryDict('a=b&c=d&a=1')
191191
q1 = pickle.loads(pickle.dumps(q, 2))
192-
self.assertEqual(q == q1 , True)
192+
self.assertEqual(q == q1, True)
193193

194194
def test_update_from_querydict(self):
195195
"""Regression test for #8278: QueryDict.update(QueryDict)"""

0 commit comments

Comments
 (0)