sostituzione della stringa in pitone con% carattere / ** stranezza di kwargs
-
08-07-2019 - |
Domanda
Codice seguente:
def __init__(self, url, **kwargs):
for key in kwargs.keys():
url = url.replace('%%s%' % key, str(kwargs[key]))
Genera la seguente eccezione:
File "/home/wells/py-mlb/lib/fetcher.py", line 25, in __init__
url = url.replace('%%s%' % key, str(kwargs[key]))
ValueError: incomplete format
La stringa ha un formato come:
http://www.blah.com?id=%PLAYER_ID%
Cosa sto sbagliando?
Soluzione
Probabilmente vuoi la stringa di formato %%% s %%
invece di %% s%
.
Due segni consecutivi %
vengono interpretati come un %
letterale, quindi nella tua versione hai un %
letterale, un %
solitario, che si aspetta un identificatore di formato dopo di esso. Devi raddoppiare ogni %
letterale per non essere interpretato come una stringa di formato, quindi vuoi %%% s %%
: %
letterale , % s
per stringa, %
letterale.
Altri suggerimenti
è necessario raddoppiare il segno di percentuale per evitarlo:
>>> '%%%s%%' % 'PLAYER_ID'
'%PLAYER_ID%'
anche quando si scorre sul dizionario è possibile decomprimere i valori nell'istruzione for in questo modo:
def __init__(self, url, **kwargs):
for key, value in kwargs.items():
url = url.replace('%%%s%%' % key, str(value))
Adam aveva quasi ragione. Cambia il tuo codice in:
def __init__(self, url, **kwargs):
for key in kwargs.keys():
url = url.replace('%%%s%%' % key, str(kwargs[key]))
Quando la chiave è FOO, quindi '%%% s %%'% key
genera '% FOO%'
e url.replace farà ciò che volere. In una stringa di formato, due percentuali generano una percentuale nell'output.