Descubra as variáveis disponíveis na formatação de string nomeada do Python [duplicado]
Dado um modelo / string de formatação "{foo}_{bar}"
, como posso extrair programaticamente as chaves de formatação necessárias ["foo", "bar"]
?
Eu tenho ditos de parâmetros para vários experimentos
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}"}
]
Como você pode ver, o segundo conjunto de parâmetros está sem chave baz
. Então, quando eu faço algo como
"{biz}_{baz}".format(**parameters)
, ele gera um KeyError, porque baz
está faltando.
Desejo substituir todos os parâmetros ausentes por NR
e preencher todos os parâmetros disponíveis com seus valores.
A saída é então:
[
{"parameters": {"foo": 1, "bar": 2}, "format": `"{foo}_{bar}"`, "formatted": "1_2"},
{"parameters": {"biz": 3}, "format": "{biz}_{baz}", "formatted": "3_NR"}
]
Para contexto: eu tenho mais de 100 strings, sem consistência entre os parâmetros esperados necessários para aquela string.
Respostas
Você pode reunir com eficiência os nomes dos parâmetros necessários da string e, em seguida, verificar se há alguma chave ausente, verificando a semelhança entre as chaves reais. Se houver chaves faltando, adicione-as com o valor "NR". Finalmente, use .format
para formatar corretamente a string em uma chave "formatada".
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'}]