Adlandırılmış Python Dize Biçimlendirmesindeki Kullanılabilir Değişkenleri Bulun [duplicate]

Dec 13 2020

Bir şablon / biçimlendirme dizesi verildiğinde "{foo}_{bar}", gerekli biçimlendirme anahtarlarını programlı olarak nasıl çıkarabilirim ["foo", "bar"]?

Çeşitli deneyler için parametrelerim var

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

Gördüğünüz gibi, ikinci parametre setinde anahtar eksik baz. Bu yüzden böyle bir şey yaptığımda

"{biz}_{baz}".format(**parameters)bazeksik olduğundan bir KeyError oluşturur .

Bütün değiştirmek istiyor eksik olan parmaters NRve onların değerleri ile mevcut tüm parametreleri doldurun.

Çıktı daha sonra:

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

Bağlam için: Bu dize için gerekli beklenen parametreler arasında tutarlılık olmadan 100'den fazla dizem var .

Yanıtlar

2 BramVanroy Dec 13 2020 at 21:51

Gerekli parametre adlarını dizeden verimli bir şekilde toplayabilir ve ardından gerçek anahtarlar arasında küme benzerliği olup olmadığını kontrol ederek eksik anahtar olup olmadığını kontrol edebilirsiniz. Eksik anahtarlar varsa, bunları "NR" değeriyle ekleyin. Son olarak, .formatdizeyi "biçimlendirilmiş" bir anahtara doğru şekilde biçimlendirmek için kullanın .

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'}]