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.

Insecto
fuente
1
Probablemente podría realizar la misma tarea con una lista de comprensión (use enumeratepara obtener los puntos).
SwiftsNamesake
Ver también (duplicado) stackoverflow.com/questions/35574349/…
dreftymac

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))
Lasse V. Karlsen
fuente
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