Sprawdź dostępne zmienne w nazwanym formatowaniu ciągów w języku Python [duplikat]
Biorąc pod uwagę szablon / ciąg formatujący "{foo}_{bar}"
, w jaki sposób mogę programowo wyodrębnić wymagane klucze formatowania ["foo", "bar"]
?
Mam instrukcje parametrów dla różnych eksperymentów
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]
Jak widać, w drugim zestawie parametrów brakuje klucza baz
. Więc kiedy robię coś takiego
"{biz}_{baz}".format(**parameters)
, wywołuje błąd KeyError, ponieważ baz
brakuje.
Chcę wymienić wszystkie brakujące parmaters z NR
, i wypełnić wszystkie dostępne parametry z ich wartościami.
Wynik jest zatem:
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]
W kontekście: mam ponad 100 ciągów, bez spójności między oczekiwanymi parametrami wymaganymi dla tego ciągu.
Odpowiedzi
Możesz efektywnie zebrać wymagane nazwy parametrów z ciągu, a następnie sprawdzić, czy nie ma brakujących kluczy, sprawdzając podobieństwo zestawu rzeczywistych kluczy. Jeśli brakuje kluczy, dodaj je z wartością „NR”. Na koniec użyj, .format
aby poprawnie sformatować ciąg jako „sformatowany” klucz.
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'}]