python字符串替换为%character / ** kwargs古怪
-
08-07-2019 - |
题
以下代码:
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%
我做错了什么?
解决方案
您可能需要格式字符串 %%% s %%
而不是 %% s%
。
两个连续的%
符号被解释为文字%
,因此在您的版本中,您有一个文字%
,一个文字 s
,然后是一个单独的%
,它需要一个格式说明符。您需要将每个文字%
加倍,以免被解释为格式字符串,因此您需要 %%% s %%
:literal %
,%s
表示字符串,文字%
。
其他提示
你需要加倍百分号以逃避它:
>>> '%%%s%%' % 'PLAYER_ID'
'%PLAYER_ID%'
当迭代字典时,您可以在for语句中解压缩值,如下所示:
def __init__(self, url, **kwargs):
for key, value in kwargs.items():
url = url.replace('%%%s%%' % key, str(value))
亚当几乎把它做对了。将您的代码更改为:
def __init__(self, url, **kwargs):
for key in kwargs.keys():
url = url.replace('%%%s%%' % key, str(kwargs[key]))
当密钥是FOO时,'%%% s %%'%key
会导致'%FOO%'
,而你的url.replace会做你做的事情想。在格式字符串中,两个百分比会导致输出中的百分比。
不隶属于 StackOverflow