def urlencode(query, doseq=0):
    """Encode a sequence of two-element tuples or dictionary into a URL
    query string.

    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()
            # non-empty strings will fail this
            if len(query) and not isinstance(query[0], tuple):
                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 __HOLE__:
            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 query:
            k = quote_plus(str(k))
            v = quote_plus(v)
            l.append(k + '=' + v)
    else:
        for k, v in query:
            k = quote_plus(str(k))
            if isinstance(v, basestring):
                if v:
                    v = quote_plus(v)
                    l.append("%s=%s" % (k, v))
                else:
                    l.append(k)
            else:
                try:
                    # is this a sufficient test for sequence-ness?
                    x = len(v)
                except TypeError:
                    # not a sequence
                    v = quote_plus(v)
                    if v:
                        l.append("%s=%s" % (k, v))
                    else:
                        l.append(k)
                else:
                    # loop over the sequence
                    for elt in v:
                        if elt:
                            l.append(k + '=' + quote_plus(elt))
                        else:
                            l.append(k)
    return '&'.join(l)
dataset/ETHPy150Open kdart/pycopia/aid/pycopia/urlparse.py/urlencode