5

次のコード:

def __init__(self, url, **kwargs):
    for key in kwargs.keys():
        url = url.replace('%%s%' % key, str(kwargs[key]))

次の例外をスローします。

File "/home/wells/py-mlb/lib/fetcher.py", line 25, in __init__
url = url.replace('%%s%' % key, str(kwargs[key]))
ValueError: incomplete format

文字列の形式は次のとおりです。

http://www.blah.com?id=%PLAYER_ID%

私は何を間違っていますか?

4

3 に答える 3

15

おそらく、%%%s%%代わりにフォーマット文字列が必要です%%s%

2 つの連続%する記号はliteral として解釈される%ため、あなたのバージョンでは、literal %、literal 、そしてその後にフォーマット指定子が必要sなloneがあります。フォーマット文字列として解釈されないようにするには、各リテラルを 2 倍にする必要があるため、次のようにし%ます。%%%%s%%%%s%

于 2009-10-28T22:22:00.873 に答える
3

エスケープするには、パーセント記号を 2 倍にする必要があります。

>>> '%%%s%%' % 'PLAYER_ID'
'%PLAYER_ID%'

また、辞書を反復処理するときは、次のように for ステートメントで値をアンパックできます。

def __init__(self, url, **kwargs):
    for key, value in kwargs.items():
        url = url.replace('%%%s%%' % key, str(value))
于 2009-10-28T22:23:18.800 に答える
1

アダムはほぼ正しかった。コードを次のように変更します。

def __init__(self, url, **kwargs):
    for key in kwargs.keys():
        url = url.replace('%%%s%%' % key, str(kwargs[key]))

キーが FOO の場合、'%%%s%%' % key結果は'%FOO%'になり、url.replace は必要な処理を行います。フォーマット文字列では、2 パーセントは出力でパーセントになります。

于 2009-10-28T22:23:59.720 に答える