urlencode python中的多维字典

pab*_*obm 7 python urlencode

如何在Python中获取多维字典的URL编码版本?不幸的是,urllib.urlencode()只能在一个维度上工作.我需要一个能够递归编码字典的版本.

例如,如果我有以下字典:

{'a': 'b', 'c': {'d': 'e'}}
Run Code Online (Sandbox Code Playgroud)

我想获取以下字符串:

a=b&c[d]=e
Run Code Online (Sandbox Code Playgroud)

pab*_*obm 10

好的人.我自己实现了:

import urllib

def recursive_urlencode(d):
    """URL-encode a multidimensional dictionary.

    >>> data = {'a': 'b&c', 'd': {'e': {'f&g': 'h*i'}}, 'j': 'k'}
    >>> recursive_urlencode(data)
    u'a=b%26c&j=k&d[e][f%26g]=h%2Ai'
    """
    def recursion(d, base=[]):
        pairs = []

        for key, value in d.items():
            new_base = base + [key]
            if hasattr(value, 'values'):
                pairs += recursion(value, new_base)
            else:
                new_pair = None
                if len(new_base) > 1:
                    first = urllib.quote(new_base.pop(0))
                    rest = map(lambda x: urllib.quote(x), new_base)
                    new_pair = "%s[%s]=%s" % (first, ']['.join(rest), urllib.quote(unicode(value)))
                else:
                    new_pair = "%s=%s" % (urllib.quote(unicode(key)), urllib.quote(unicode(value)))
                pairs.append(new_pair)
        return pairs

    return '&'.join(recursion(d))

if __name__ == "__main__":
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

不过,我有兴趣知道是否有更好的方法来做到这一点.我不敢相信Python的标准库没有实现这一点.

  • 为什么要这样?这绝不是标准格式.带方括号的东西是PHP特有的特性,在大多数其他语言/框架或任何Web标准中都不存在. (8认同)
  • 它可能不是纯粹的RFC描述的IETF/W3C支持的圣 - 通心粉标准,但它现在如此常用,它不包含在Python的标准库中确实无法理解我的理解.我已经开发了许多平台和语言的Web应用程序,这一直是惯例.这包括基于Python的环境,例如Django:所以不,它不再是PHP专用的东西了. (5认同)
  • Eric Lubow:感谢错误报告.我刚刚纠正了它,现在应该没事了. (2认同)