Cari Tahu Variabel yang Tersedia dalam Pemformatan String Python Bernama [duplikat]

Dec 13 2020

Diberikan template / string pemformatan "{foo}_{bar}", bagaimana saya dapat mengekstrak secara terprogram kunci pemformatan yang diperlukan ["foo", "bar"]?

Saya memiliki kode parameter untuk berbagai eksperimen

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

Seperti yang Anda lihat, set parameter kedua kehilangan kunci baz. Jadi ketika saya melakukan sesuatu seperti

"{biz}_{baz}".format(**parameters), ini memunculkan KeyError, karena bazhilang.

Saya ingin mengganti semua parmater yang hilang dengan NR, dan mengisi semua parameter yang tersedia dengan nilainya.

Outputnya kemudian:

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

Untuk konteks: Saya memiliki 100+ string, tanpa konsistensi antara parameter yang diharapkan diperlukan untuk string itu.

Jawaban

2 BramVanroy Dec 13 2020 at 21:51

Anda dapat secara efisien mengumpulkan nama parameter yang diperlukan dari string tersebut, lalu memeriksa apakah ada kunci yang hilang dengan memeriksa kesamaan set antara kunci yang sebenarnya. Jika ada kunci yang hilang, tambahkan dengan nilai "NR". Terakhir, gunakan .formatuntuk memformat string dengan benar menjadi kunci "diformat".

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