Descubra las variables disponibles en el formato de cadena de Python con nombre [duplicado]
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 baz
falta.
Quiero reemplazar todos los parámetros faltantes con NR
y 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
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 .format
para 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'}]