Quelle est la bonne façon de formater les clés dict dans string?
Quand je fais ça:
>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> "In the middle of a string: {foo.keys()}".format(**locals())
Ce que j'attends
"In the middle of a string: ['one key', 'second key']"
Ce que je reçois
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
"In the middle of a string: {foo.keys()}".format(**locals())
AttributeError: 'dict' object has no attribute 'keys()'
Mais comme vous pouvez le voir, mon dict a des clés:
>>> foo.keys()
['second key', 'one key']
Vous ne pouvez pas appeler de méthodes dans les espaces réservés. Vous pouvez accéder aux propriétés et attributs et même indexer la valeur, mais vous ne pouvez pas appeler de méthodes:
class Fun(object):
def __init__(self, vals):
self.vals = vals
@property
def keys_prop(self):
return list(self.vals.keys())
def keys_meth(self):
return list(self.vals.keys())
Exemple avec méthode (échec):
>>> foo = Fun({'one key': 'one value', 'second key': 'second value'})
>>> "In the middle of a string: {foo.keys_meth()}".format(foo=foo)
AttributeError: 'Fun' object has no attribute 'keys_meth()'
Exemple avec propriété (active):
>>> foo = Fun({'one key': 'one value', 'second key': 'second value'})
>>> "In the middle of a string: {foo.keys_prop}".format(foo=foo)
"In the middle of a string: ['one key', 'second key']"
La syntaxe de formatage indique clairement que vous ne pouvez accéder qu'aux attributs (à la getattr
) ou à l'index (à la __getitem__
) des espaces réservés (extraits de "Syntaxe de chaîne de formatage" ):
Le nom_argument peut être suivi d'un nombre quelconque d'expressions d'index ou d'attribut. Une expression de la forme
'.name'
sélectionne l'attribut nommé à l'aide degetattr()
, tandis qu'une expression de la forme'[index]'
effectue une recherche d'index à l'aide de__getitem__()
.
Avec Python 3.6, vous pouvez facilement le faire avec des f-strings, vous n’avez même pas besoin de passer locals
:
>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> f"In the middle of a string: {foo.keys()}"
"In the middle of a string: dict_keys(['one key', 'second key'])"
>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> f"In the middle of a string: {list(foo.keys())}"
"In the middle of a string: ['one key', 'second key']"
"In the middle of a string: {}".format([k for k in foo])
Comme cela a été dit par d'autres ci-dessus, vous ne pouvez pas le faire comme vous le souhaitez, voici des informations supplémentaires à suivre le format de chaîne python appelant une fonction
"In the middle of a string: {}".format(list(foo.keys()))