以下代码:
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%
我做错了什么?
答案 0 :(得分:15)
您可能需要格式字符串%%%s%%
而不是%%s%
。
两个连续的%
符号被解释为文字%
,因此在您的版本中,您有一个文字%
,一个文字s
,然后是一个%
{1}},期待它之后的格式说明符。您需要将每个文字%
加倍,以免被解释为格式字符串,因此您需要%%%s%%
:文字%
,%s
表示字符串,文字{{1} }。
答案 1 :(得分:3)
你需要加倍百分号以逃避它:
>>> '%%%s%%' % 'PLAYER_ID'
'%PLAYER_ID%'
当迭代字典时,您可以在for语句中解压缩值,如下所示:
def __init__(self, url, **kwargs):
for key, value in kwargs.items():
url = url.replace('%%%s%%' % key, str(value))
答案 2 :(得分: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会执行您想要的操作。在格式字符串中,两个百分比会导致输出中的百分比。