From: SarunasAzna Date: Sat, 12 Dec 2020 17:38:37 +0000 (+0100) Subject: Allow tuple as input of query parameters. (#1426) X-Git-Tag: 0.17.0~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86964054d60da7796c65e501ba021440b14cc36c;p=thirdparty%2Fhttpx.git Allow tuple as input of query parameters. (#1426) * Allow tuple as input of query parameters. In the documentation it is stated that params can be dict, string or two tuples. This allows to used two tuples. Previously it was possible to use only tuple inside a list. * tests for two tuples * use isinstance to check the type of query params * change list|tuple to in Sequence * update documentation * fix typing --- diff --git a/httpx/_api.py b/httpx/_api.py index 985e2ab9..8cfaf6df 100644 --- a/httpx/_api.py +++ b/httpx/_api.py @@ -47,7 +47,7 @@ def request( `HEAD`, `POST`, `PUT`, `PATCH`, or `DELETE`. * **url** - URL for the new `Request` object. * **params** - *(optional)* Query parameters to include in the URL, as a - string, dictionary, or list of two-tuples. + string, dictionary, or sequence of two-tuples. * **content** - *(optional)* Binary content to include in the body of the request, as bytes or a byte iterator. * **data** - *(optional)* Form data to include in the body of the request, diff --git a/httpx/_client.py b/httpx/_client.py index 0ae5f2b1..4f457c79 100644 --- a/httpx/_client.py +++ b/httpx/_client.py @@ -520,7 +520,7 @@ class Client(BaseClient): * **auth** - *(optional)* An authentication class to use when sending requests. * **params** - *(optional)* Query parameters to include in request URLs, as - a string, dictionary, or list of two-tuples. + a string, dictionary, or sequence of two-tuples. * **headers** - *(optional)* Dictionary of HTTP headers to include when sending requests. * **cookies** - *(optional)* Dictionary of Cookie items to include when @@ -1161,7 +1161,7 @@ class AsyncClient(BaseClient): * **auth** - *(optional)* An authentication class to use when sending requests. * **params** - *(optional)* Query parameters to include in request URLs, as - a string, dictionary, or list of two-tuples. + a string, dictionary, or sequence of two-tuples. * **headers** - *(optional)* Dictionary of HTTP headers to include when sending requests. * **cookies** - *(optional)* Dictionary of Cookie items to include when diff --git a/httpx/_models.py b/httpx/_models.py index a77f7a57..2d118882 100644 --- a/httpx/_models.py +++ b/httpx/_models.py @@ -441,7 +441,7 @@ class QueryParams(typing.Mapping[str, str]): items = parse_qsl(value) elif isinstance(value, QueryParams): items = value.multi_items() - elif isinstance(value, list): + elif isinstance(value, (list, tuple)): items = value else: items = flatten_queryparams(value) diff --git a/httpx/_types.py b/httpx/_types.py index 776df1d8..7768bac1 100644 --- a/httpx/_types.py +++ b/httpx/_types.py @@ -35,6 +35,7 @@ QueryParamTypes = Union[ "QueryParams", Mapping[str, Union[PrimitiveData, Sequence[PrimitiveData]]], List[Tuple[str, PrimitiveData]], + Tuple[Tuple[str, PrimitiveData], ...], str, bytes, None, diff --git a/tests/models/test_queryparams.py b/tests/models/test_queryparams.py index d591eded..7031a65c 100644 --- a/tests/models/test_queryparams.py +++ b/tests/models/test_queryparams.py @@ -9,6 +9,8 @@ import httpx "a=123&a=456&b=789", {"a": ["123", "456"], "b": 789}, {"a": ("123", "456"), "b": 789}, + [("a", "123"), ("a", "456"), ("b", "789")], + (("a", "123"), ("a", "456"), ("b", "789")), ], ) def test_queryparams(source):