1

以下是按预期工作的代码块。

   for key in context:
        if isinstance(context[key],collections.Iterable):
            queryString += '%s=%s&' % (key, urllib.quote(context[key]))
        else:
            queryString += '%s=%s&' % (key, context[key])
    return queryString

但是我不明白 if 块的用途。下面的工作不应该吗?

for key in context:
    queryString += '%s=%s&' % (key, context[key])
return queryString
4

1 回答 1

3

它基本上是在说“在转换为字符串表示时引用任何不是数字或序列的东西”。它转义字符以使它们进行urlencoded。

if阻止它引用int,float等,因为这些会使quote函数崩溃。

context = {'a': 'a b c', 'b': ('a', '@', 'c'), 'c': 1}
queryString = ''

for key in context:
    if isinstance(context[key],collections.Iterable):
        queryString += '%s=%s&' % (key, urllib.quote(context[key]))
    else:
        queryString += '%s=%s&' % (key, context[key])

print queryString
# a=a%20b%20c&c=1&b=a%40c&

尽管这仅取决于您的潜在输入可能是什么(上下文的值)才有意义。它会崩溃说,一个整数列表。

不使用quote看起来像这样:

for key in context:
    queryString += '%s=%s&' % (key, context[key])

# invalid url format
# a=a b c&c=1&b=('a', '@', 'c')&

并且运行quote一切将导致:

for key in context:
    queryString += '%s=%s&' % (key, urllib.quote(context[key]))
...
TypeError: argument 2 to map() must support iteration
于 2012-12-11T03:05:01.957 回答