str.format () genera KeyError


80

El siguiente código genera una KeyErrorexcepción:

addr_list_formatted = []
addr_list_idx = 0

for addr in addr_list: # addr_list is a list
    addr_list_idx = addr_list_idx + 1
    addr_list_formatted.append("""
        "{0}"
        {
        "gamedir"  "str"
        "address"  "{1}"
        }
    """.format(addr_list_idx, addr))

¿Por qué?

Estoy usando Python 3.1.


1
Probablemente podría realizar la misma tarea con una lista de comprensión (use enumeratepara obtener los puntos).
SwiftsNamesake

Respuestas:


144

El problema son esos {y los }caracteres que tiene allí que no especifican una clave para formatear. Necesita duplicarlos, así que cambie su código a:

addr_list_formatted.append("""
    "{0}"
    {{
    "gamedir"  "str"
    "address"  "{1}"
    }}
""".format(addr_list_idx, addr))

12
¿Qué pasa si alguien quisiera usar JSON en Python?
fijiaaron

4
@fijiaaron el doble {en la respuesta es solo para decirle al formatmétodo que no hay una clave para formatear aquí (por lo que se escapan en la cadena formateada y no debería ser un problema para construir un JSON de esa manera). Alternativamente, hay otras formas eficientes de manipular cadenas, como el joinmétodo:"".join(['{"', var_name, '":', value, '}'])
mgc

Casi pierdo la cabeza hasta que me di cuenta de cuál era el problema
Dmitry Kankalovich

1
@DmitryKankalovich Has perdido la cabeza, Stack Overflow, y todos los que están aquí, es solo un producto de tu imaginación. (eso es lo que me sigo diciendo al menos) :)
Lasse V. Karlsen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.