5

以下代码:

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%

我究竟做错了什么?

4

3 回答 3

15

您可能需要格式字符串%%%s%%而不是%%s%.

两个连续%的符号被解释为一个 literal %,所以在你的版本中,你有一个 literal %,一个 literal s,然后是一个 lone %,它后面需要一个格式说明符。您需要将每个文字加倍%以不被解释为格式字符串,因此您需要%%%s%%: literal %, %sfor string, literal %

于 2009-10-28T22:22:00.873 回答
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))
于 2009-10-28T22:23:18.800 回答
1

亚当几乎是对的。将您的代码更改为:

def __init__(self, url, **kwargs):
    for key in kwargs.keys():
        url = url.replace('%%%s%%' % key, str(kwargs[key]))

当 key 为 FOO 时,'%%%s%%' % key结果为'%FOO%',并且您的 url.replace 将执行您想要的操作。在格式字符串中,两个百分比会在输出中产生一个百分比。

于 2009-10-28T22:23:59.720 回答