Finden Sie verfügbare Variablen in der benannten Python-Zeichenfolgenformatierung heraus [Duplikat]
"{foo}_{bar}"
Wie kann ich bei einer Vorlage / Formatierungszeichenfolge die erforderlichen Formatierungsschlüssel programmgesteuert extrahieren ["foo", "bar"]
?
Ich habe Parameter für verschiedene Experimente
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]
Wie Sie sehen können, fehlt dem zweiten Parametersatz der Schlüssel baz
. Also wenn ich so etwas mache
"{biz}_{baz}".format(**parameters)
, es wird ein KeyError ausgelöst, da dieser baz
fehlt.
Ich möchte alle fehlenden Parmater durch ersetzen NR
und alle verfügbaren Parameter mit ihren Werten füllen.
Die Ausgabe ist dann:
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]
Für den Kontext: Ich habe mehr als 100 Zeichenfolgen, ohne Konsistenz zwischen den erwarteten Parametern, die für diese Zeichenfolge erforderlich sind.
Antworten
Sie können die erforderlichen Parameternamen effizient aus der Zeichenfolge erfassen und dann überprüfen, ob Schlüssel fehlen, indem Sie die Ähnlichkeit zwischen den tatsächlichen Schlüsseln überprüfen. Wenn Schlüssel fehlen, fügen Sie diese mit dem Wert "NR" hinzu. Verwenden Sie schließlich, um .format
die Zeichenfolge korrekt in einen "formatierten" Schlüssel zu formatieren.
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'}]