Python 字符串替换中的 % 字符/**kwargs 异常情况

5 投票
3 回答
7909 浏览
提问于 2025-04-15 15:28

以下代码:

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 用来表示字符串,再加一个普通的 %

撰写回答