Opened 3 hours ago

#35915 new Cleanup/optimization

QueryDict __getitem__ returns list which is surpising

Reported by: Nguyễn Hồng Quân Owned by:
Component: HTTP handling Version: 5.1
Severity: Normal Keywords: querydict
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Though documentation says that

QueryDict.__getitem__(key)
Returns the value for the given key. If the key has more than one value, it returns the last value.

It returns a list when the raw value is an empty list:

>>> from django.http import QueryDict
>>> q = QueryDict('a=1', mutable=True)
>>> q['a']
'1'

>>> q.setlist('b', [])
>>> q['b']
[]

which surprises user and it even not mentioned in documentation.

Could we change this behavior? I know that we don't have a perfect solution, but returning None in this case is less bad than empty list [], because it is easier to annotate type.

  • If returns None, we can annotate type as str | None.
  • If returns [], Python doesn't have an exact type for empty list, and django-stubs has to annotate as str | list[object] which is quite broader than the actual value (empty list).

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top