2015-08-06 13 views
5

sto correndo il seguente codice:Formato: KeyError quando si utilizza parentesi graffe nelle stringhe

asset = {} 
asset['abc'] = 'def' 
print type(asset) 
print asset['abc'] 
query = '{"abc": "{abc}"}'.format(abc=asset['abc']) 
print query 

che getta un errore di KeyError:

[[email protected]] : ~/Documents/vision/inputs/perma_sniff $ python ~/test.py 
<type 'dict'> 
def 
Traceback (most recent call last): 
    File "/home/user/test.py", line 5, in <module> 
    query = '\{"abc": "{abc}"\}'.format(abc=asset['abc']) 
KeyError: '"abc"' 

Format è ovviamente sempre confuso dal avvolgendo {. Come posso assicurarmi che il formato cerchi solo di sostituire il (corretto) interno {abc}.

cioè, risultato atteso è:

{"abc": "def"} 

(.. Mi rendo conto che potrei utilizzare il modulo json per questo compito, ma voglio evitare che io preferirei di gran lunga utilizzare il formato)

risposta

14

Per inserire un tutore letterale, raddoppiare l'alto:

query = '{{"abc": "{abc}"}}'.format(abc=asset['abc']) 

(Questo è documentato here, ma non evidenziata particolarmente ovviamente).

2

avvolgere le parentesi esterne tra parentesi graffe:

query = '{{"abc": "{abc}"}}'.format(abc=asset['abc']) 
print query 
{"abc": "def"} 
+1

pensate che la vostra doppia stretta brace è quella sbagliata. dovrebbe essere: ''{{" abc ":" {abc} "}}'' – tom

+0

@tom, yep, typo fixed –

0

più in alto parentesi graffe sono interpretate come una chiave segnaposto all'interno di stringa, in tal modo si ottiene il KeyError. Hai bisogno di sfuggire loro in questo modo:

asset = {} 
asset['abc'] = 'def' 
query = '{{"abc": "{abc}"}}'.format(**asset) 

E poi:

>>> print query 
{"abc": "def"} 
Problemi correlati