замена строки Python символом% / / kwargs странность - PullRequest
5 голосов
/ 29 октября 2009

следующий код:

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 ]

15 голосов
/ 29 октября 2009

Возможно, вам нужна строка формата %%%s%% вместо %%s%.

Два последовательных знака % интерпретируются как литерал %, поэтому в вашей версии у вас есть литерал %, литерал s, а затем одиночный %, который ожидает формат спецификатор после него. Вам нужно удвоить каждый литерал %, чтобы он не интерпретировался как строка формата, поэтому вам нужно %%%s%%: литерал %, %s для строки, литерал %.

3 голосов
/ 29 октября 2009

вам нужно удвоить знак процента, чтобы избежать его:

>>> '%%%s%%' % 'PLAYER_ID'
'%PLAYER_ID%'

также при переборе словаря вы можете распаковать значения в операторе for следующим образом:

def __init__(self, url, **kwargs):
    for key, value in kwargs.items():
        url = url.replace('%%%s%%' % key, str(value))
1 голос
/ 29 октября 2009

Адам почти все понял. Измените свой код на:

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

Если ключ FOO, тогда '%%%s%%' % key приводит к '%FOO%', и ваш url.replace будет делать то, что вы хотите В строке формата два процента приводят к проценту в выводе.

...