замена строки питона символом% / / kwargs странность

StackOverflow https://stackoverflow.com/questions/1640487

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top