Author mrts
Recipients mrts
Date 2009-04-29.13:32:11
SpamBayes Score 3.10751e-13
Marked as misclassified No
Message-id <1241011935.05.0.388851858626.issue5877@psf.upfronthosting.co.za>
In-reply-to
Content
Proposal
--------

Add update_query_params() for updating or adding URL query parameters to
urllib.parse and urlparse.

Discussion
----------

Python-dev:
http://mail.python.org/pipermail/python-dev/2009-April/088675.html

Previously in Python-ideas:
http://mail.python.org/pipermail/python-ideas/2009-March/003728.html

The consensus seems to be that this is needed, opinions on how the API
should look like vary.

Behaviour
---------

The following features were requested by different people:
- ability to order parameters (by passing them in a ordered data structure)
- "plain" behaviour that would keep the existing parameters as is and
add passed in parameters, retaining duplicates
- behaviour that removes duplicated values
- dict.update()-like behaviour that would not allow duplicate keys
(updating values for existing keys)
- removal of existing parameters

Implementation
--------------

http://github.com/mrts/qparams/tree/master
in particular
http://github.com/mrts/qparams/blob/bf1b29ad46f9d848d5609de6de0bfac1200da310/qparams.py

See the docstring in qparams.py for 

Currently, positional arguments are used to avoid name collisions in
keyword arguments that were initially devised as the default, easy way
to pass parameters. As the function signature has grown quite complex,
this looks suboptimal.

Also, the general sentiment was that the current three-valued logic for
choosing key update strategy is also suboptimal. Instead, the strategy
should be passed via a function and the strategies listed above should
be provided in the module.

Finally, removing keys is currently missing. It was proposed that
passing foo=None would remove the parameter foo. Currently, None is used
to mark parameters that do not take values, another marker is needed for
that if removal is to be marked with None.

Following on Nick Coghlan's suggestion in
http://mail.python.org/pipermail/python-dev/2009-April/088866.html and
considering the preference for a strategy function, the API could look
as follows:

def add_query_params(url, params, strategy=allow_dulicates, sep='&')

I.e. keyword arguments would not be supported and the "default" use
would be as follows:

>>> add_query_params('foo', dict(bar='baz'))
'foo?bar=baz'
History
Date User Action Args
2009-04-29 13:32:15mrtssetrecipients: + mrts
2009-04-29 13:32:15mrtssetmessageid: <1241011935.05.0.388851858626.issue5877@psf.upfronthosting.co.za>
2009-04-29 13:32:13mrtslinkissue5877 messages
2009-04-29 13:32:11mrtscreate