Cari Tahu Variabel yang Tersedia dalam Pemformatan String Python Bernama [duplikat]
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 baz
hilang.
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
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 .format
untuk 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'}]