Découvrez les variables disponibles dans le formatage de chaîne Python nommé [duplicate]
É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 baz
manque.
Je veux remplacer tous les parmaters manquants par NR
et 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
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 .format
pour 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'}]