]> granicus.if.org Git - python/commitdiff
allow first param urlencode to be a sequence of two-element tuples - in this
authorSkip Montanaro <skip@pobox.com>
Sun, 28 Jan 2001 21:11:12 +0000 (21:11 +0000)
committerSkip Montanaro <skip@pobox.com>
Sun, 28 Jan 2001 21:11:12 +0000 (21:11 +0000)
case, the order of parameters in the output matches the order of the inputs.

Lib/urllib.py

index f096151b88770baa7520f06bdec582893bc690d3..a410e71315f7effe017f8d4e96d2d5324a9d91ce 100644 (file)
@@ -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)