Descubra las variables disponibles en el formato de cadena de Python con nombre [duplicado]

Dec 13 2020

Dada una plantilla / cadena de formato "{foo}_{bar}", ¿cómo puedo extraer mediante programación las claves de formato necesarias ["foo", "bar"]?

Tengo dictados de parámetros para varios experimentos.

[
    {"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
    {"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]

Como puede ver, falta la clave del segundo conjunto de parámetros baz. Entonces, cuando hago algo como

"{biz}_{baz}".format(**parameters), genera un KeyError, porque bazfalta.

Quiero reemplazar todos los parámetros faltantes con NRy completar todos los parámetros disponibles con sus valores.

La salida es entonces:

[
    {"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
    {"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]

Para el contexto: tengo más de 100 cadenas, sin coherencia entre los parámetros esperados requeridos para esa cadena.

Respuestas

2 BramVanroy Dec 13 2020 at 21:51

Puede recopilar de manera eficiente los nombres de parámetros requeridos de la cadena y luego verificar si faltan claves comprobando la similitud de conjuntos entre las claves reales. Si faltan claves, agréguelas con el valor "NR". Finalmente, utilice .formatpara formatear correctamente la cadena en una clave "formateada".

ds = [
    {"parameters": {"foo": 1, "bar": 2}, "format": "{foo}_{bar}"},
    {"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]

for d in ds:
    # Copy params so that we do not change params in-place
    params = d["parameters"]
    req_keys = set(d["format"][1:-1].split("}_{"))
    missing_keys = req_keys.difference(params.keys())

    if len(missing_keys) > 0:
        params = {**params, **{key: "NR" for key in missing_keys}}

    d["formatted"] = d["format"].format(**params)

print(ds)

# [{'parameters': {'foo': 1, 'bar': 2}, 'format': '{foo}_{bar}', 'formatted': '1_2'}, {'parameters': {'biz': 3}, 'format': '{biz}_{baz}', 'formatted': '3_NR'}]