замена строки питона символом% / / 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 будет делать то, что вы хочу. В строке формата два процента приводят к проценту в выводе.