Descubra as variáveis ​​disponíveis na formatação de string nomeada do Python [duplicado]

Dec 13 2020

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 bazestá faltando.

Desejo substituir todos os parâmetros ausentes por NRe 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

2 BramVanroy Dec 13 2020 at 21:51

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