Découvrez les variables disponibles dans le formatage de chaîne Python nommé [duplicate]

Dec 13 2020

Étant donné un modèle / une chaîne de mise en forme "{foo}_{bar}", comment puis-je extraire par programme les clés de mise en forme requises ["foo", "bar"]?

J'ai des dicts de paramètres pour diverses expériences

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

Comme vous pouvez le voir, le deuxième jeu de paramètres n'a pas de clé baz. Alors quand je fais quelque chose comme

"{biz}_{baz}".format(**parameters), il déclenche une KeyError, car il bazmanque.

Je veux remplacer tous les parmaters manquants par NRet remplir tous les paramètres disponibles avec leurs valeurs.

La sortie est alors:

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

Pour le contexte: j'ai plus de 100 chaînes, sans cohérence entre les paramètres attendus requis pour cette chaîne.

Réponses

2 BramVanroy Dec 13 2020 at 21:51

Vous pouvez collecter efficacement les noms de paramètres requis à partir de la chaîne, puis vérifier s'il manque des clés en vérifiant la similitude d'ensemble entre les clés réelles. S'il manque des clés, ajoutez-les avec la valeur "NR". Enfin, utilisez .formatpour formater correctement la chaîne en une clé «formatée».

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