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引用できないようにします。これらは関数をクラッシュさせるためです。intfloatquote

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&

潜在的な入力が何であるか(コンテキストの値)に応じてのみ意味がありますが。たとえば、intのリストでクラッシュします。

使用しない場合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 に答える