Formato: KeyError cuando se utilizan corchetes en cadenas

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"}