python字符串替换为%character / ** kwargs古怪

时间:2009-10-28 22:19:16

标签: python string-formatting

以下代码:

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 个答案:

答案 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会执行您想要的操作。在格式字符串中,两个百分比会导致输出中的百分比。