* The
[https://github.com/django/django/blob/master/django/utils/datastructures.py#L176
current implementation] actually returns a generator object (supporting
iteration only)
* The [https://docs.djangoproject.com/en/dev/ref/request-
response/#django.http.QueryDict.items documentation] says that it is "just
like the standard dictionary `items()` method", which in Python3 returns a
dict_items object (a [https://docs.python.org/3/library/stdtypes.html
#dictionary-view-objects view object], supporting set-like operations)
* But the example in the documentation 2 lines below that show a standard
python list (supporting indexing)
I see 2 different was to fix this:
1. Update the documentation and make explicit that a generator is returned
and that `Querydict` is a bit different than python dicts
2. Make `QueryDict` behave more like python by returning a set(). This
should not break backwards compatibility (a set is more general than a
generator), but use more memory (because the set must be fully built
instead of generated lazily)
I can provide patches for any of these options, but some core devs
recommended me getting an opinion of which is the right solution before
moving forward.
--
Ticket URL: <https://code.djangoproject.com/ticket/28037>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* component: HTTP handling => Documentation
* stage: Unreviewed => Accepted
* type: Uncategorized => Bug
Old description:
> There is a multiway inconsistency about the defined behaviour of
> `QueryDict.items` (a similar thing happens for QueryDict.values`:
>
> * The
> [https://github.com/django/django/blob/master/django/utils/datastructures.py#L176
> current implementation] actually returns a generator object (supporting
> iteration only)
> * The [https://docs.djangoproject.com/en/dev/ref/request-
> response/#django.http.QueryDict.items documentation] says that it is
> "just like the standard dictionary `items()` method", which in Python3
> returns a dict_items object (a
> [https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects
> view object], supporting set-like operations)
> * But the example in the documentation 2 lines below that show a standard
> python list (supporting indexing)
>
> I see 2 different was to fix this:
> 1. Update the documentation and make explicit that a generator is
> returned and that `Querydict` is a bit different than python dicts
> 2. Make `QueryDict` behave more like python by returning a set(). This
> should not break backwards compatibility (a set is more general than a
> generator), but use more memory (because the set must be fully built
> instead of generated lazily)
>
> I can provide patches for any of these options, but some core devs
> recommended me getting an opinion of which is the right solution before
> moving forward.
New description:
There is an inconsistency about the defined behaviour of
`QueryDict.items()` (a similar thing happens for `QueryDict.values()`:
* The
[https://github.com/django/django/blob/master/django/utils/datastructures.py#L176
current implementation] actually returns a generator object (supporting
iteration only)
* The [https://docs.djangoproject.com/en/dev/ref/request-
response/#django.http.QueryDict.items documentation] says that it is "just
like the standard dictionary `items()` method", which in Python3 returns a
dict_items object (a [https://docs.python.org/3/library/stdtypes.html
#dictionary-view-objects view object], supporting set-like operations)
* But the example in the documentation 2 lines below that show a standard
python list (supporting indexing)
I see 2 different was to fix this:
1. Update the documentation and make explicit that a generator is returned
and that `Querydict` is a bit different than python dicts
2. Make `QueryDict` behave more like python by returning a set(). This
should not break backwards compatibility (a set is more general than a
generator), but use more memory (because the set must be fully built
instead of generated lazily)
I can provide patches for any of these options, but some core devs
recommended me getting an opinion of which is the right solution before
moving forward.
--
Comment:
Fixing the documentation looks like the correct way to proceed. The
current example shows the behavior on Python 2 was was
[https://github.com/django/django/commit/c716fe87821df00f9f03ecc761c914d1682591a2
#diff-f61cccc2a02c84d08ff7d28f87590566L199 to return a list].
--
Ticket URL: <https://code.djangoproject.com/ticket/28037#comment:1>
* has_patch: 0 => 1
Comment:
Thank you, created a PR: https://github.com/django/django/pull/8320
--
Ticket URL: <https://code.djangoproject.com/ticket/28037#comment:2>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/28037#comment:3>
* status: new => closed
* resolution: => fixed
Comment:
In [changeset:"8ab7ce8558792f41637d6f87f2a8a117e169dd18" 8ab7ce85]:
{{{
#!CommitTicketReference repository=""
revision="8ab7ce8558792f41637d6f87f2a8a117e169dd18"
Fixed #28037 -- Clarified that QueryDict.items()/values() are generators.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/28037#comment:3>