%character / ** kwargs weirdnessによるPython文字列の置換
-
08-07-2019 - |
質問
次のコード:
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%
何が間違っているのですか?
解決
%% s%
ではなく、フォーマット文字列 %%% s %%
が必要な場合があります。
2つの連続した%
記号はリテラル%
として解釈されるため、ご使用のバージョンでは、リテラル%
、リテラル s
、そして単独の%
で、その後にフォーマット指定子が必要です。書式文字列として解釈されないように、各リテラル%
を2倍にする必要があるため、 %%% s %%
:リテラル%
が必要です。 、文字列用の%s
、リテラル%
。
他のヒント
エスケープするにはパーセント記号を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))
アダムはほぼ正しかった。コードを次のように変更します。
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パーセントを指定すると出力がパーセントになります。
所属していません StackOverflow