Python 字符串替换中的 % 字符/**kwargs 异常情况
以下代码:
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%
我哪里做错了?
3 个回答
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 就能达到你想要的效果。在格式字符串中,两个百分号会在输出中变成一个百分号。
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))
15
你可能想要的格式字符串是 %%%s%%
,而不是 %%s%
。
两个连续的 %
符号会被当作一个普通的 %
来处理。所以在你的版本中,有一个普通的 %
,一个普通的 s
,然后还有一个单独的 %
,这个单独的 %
后面是需要一个格式说明符的。为了让每个普通的 %
不被当作格式字符串处理,你需要把它们各自写成两个 %
,所以你需要 %%%s%%
:一个普通的 %
,%s
用来表示字符串,再加一个普通的 %
。