以下是正常工作的代码块。
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
答案 0 :(得分: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