diff options
author | Skip Montanaro <skip@pobox.com> | 2001-01-28 21:11:12 (GMT) |
---|---|---|
committer | Skip Montanaro <skip@pobox.com> | 2001-01-28 21:11:12 (GMT) |
commit | 14f1ad4a949830998435f6cb3860e01046fa0da1 (patch) | |
tree | 30724e2acc4e4dd6a2fa7c0398a8723a77df610b | |
parent | 399b8af5637720d91bd503250b362f4717009eca (diff) | |
download | cpython-14f1ad4a949830998435f6cb3860e01046fa0da1.zip cpython-14f1ad4a949830998435f6cb3860e01046fa0da1.tar.gz cpython-14f1ad4a949830998435f6cb3860e01046fa0da1.tar.bz2 |
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.
-rw-r--r-- | Lib/urllib.py | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py index f096151..a410e71 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) |