Sprawdź dostępne zmienne w nazwanym formatowaniu ciągów w języku Python [duplikat]

Dec 13 2020

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ż bazbrakuje.

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

2 BramVanroy Dec 13 2020 at 21:51

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, .formataby 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'}]