Estoy ejecutando el siguiente código:
asset = {} asset['abc'] = 'def' print type(asset) print asset['abc'] query = '{"abc": "{abc}"}'.format(abc=asset['abc']) print query
Que lanza un error KeyError
:
[user@localhost] : ~/Documents/vision/inputs/perma_sniff $ python ~/test.py def Traceback (most recent call last): File "/home/user/test.py", line 5, in query = '\{"abc": "{abc}"\}'.format(abc=asset['abc']) KeyError: '"abc"'
El formato obviamente se confunde con la envoltura {
. ¿Cómo puedo asegurarme de que el formato solo intente reemplazar el (correcto) interno {abc}
?
es decir, la salida esperada es:
{"abc": "def"}
(Estoy consciente de que podría usar el módulo json
para esta tarea, pero quiero evitarlo. Preferiría usar el formato).
Para insertar un corsé literal, duplícalo:
query = '{{"abc": "{abc}"}}'.format(abc=asset['abc'])
(Esto se documenta aquí , pero no se resalta particularmente).
envolver los tirantes exteriores en tirantes:
query = '{{"abc": "{abc}"}}'.format(abc=asset['abc']) print query {"abc": "def"}
Las llaves más altas se interpretan como una clave de marcador de posición dentro de la cadena, por lo que obtiene el KeyError
. Necesitas escapar de ellos así:
asset = {} asset['abc'] = 'def' query = '{{"abc": "{abc}"}}'.format(**asset)
Y entonces:
>>> print query {"abc": "def"}