From 14f1ad4a949830998435f6cb3860e01046fa0da1 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Sun, 28 Jan 2001 21:11:12 +0000 Subject: [PATCH] allow first param urlencode to be a sequence of two-element tuples - in this case, the order of parameters in the output matches the order of the inputs. --- Lib/urllib.py | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Lib/urllib.py b/Lib/urllib.py index f096151b887..a410e71315f 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -1093,21 +1093,46 @@ def quote_plus(s, safe = ''): else: return quote(s, safe) -def urlencode(dict,doseq=0): - """Encode a dictionary of form entries into a URL query string. +def urlencode(query,doseq=0): + """Encode a sequence of two-element tuples or dictionary into a URL query string. - If any values in the dict are sequences and doseq is true, each + If any values in the query arg are sequences and doseq is true, each sequence element is converted to a separate parameter. + + If the query arg is a sequence of two-element tuples, the order of the + parameters in the output will match the order of parameters in the + input. """ + + if hasattr(query,"items"): + # mapping objects + query = query.items() + else: + # it's a bother at times that strings and string-like objects are + # sequences... + try: + # non-sequence items should not work with len() + x = len(query) + # non-empty strings will fail this + if len(query) and type(query[0]) != types.TupleType: + raise TypeError + # zero-length sequences of all types will get here and succeed, + # but that's a minor nit - since the original implementation + # allowed empty dicts that type of behavior probably should be + # preserved for consistency + except TypeError: + ty,va,tb = sys.exc_info() + raise TypeError, "not a valid non-string sequence or mapping object", tb + l = [] if not doseq: # preserve old behavior - for k, v in dict.items(): + for k, v in query: k = quote_plus(str(k)) v = quote_plus(str(v)) l.append(k + '=' + v) else: - for k, v in dict.items(): + for k, v in query: k = quote_plus(str(k)) if type(v) == types.StringType: v = quote_plus(v)