Y a-t-il des inconvénients, des mises en garde ou des avertissements de mauvaises pratiques concernant l'utilisation du modèle suivant?
def buildString(user, name = 'john', age=22):
userId = user.getUserId()
return "Name: {name}, age: {age}, userid:{userId}".format(**locals())
J'avais un code de génération de chaînes très répétitif à écrire et j'ai été tenté de l'utiliser, mais quelque chose à propos de l'utilisation de locals()
me met mal à l'aise. Y a-t-il un danger de comportement inattendu là-dedans?
Modifier: contexte
Je me suis retrouvé constamment à écrire des trucs comme:
"{name} {age} {userId} {etc}...".format(name=name, age=age, userId=userId, etc=etc)
Il existe maintenant une manière officielle de le faire, à partir de Python 3.6.0: littéraux de chaîne formatés .
Cela fonctionne comme ceci:
f'normal string text {local_variable_name}'
Par exemple. au lieu de ceux-ci:
"hello %(name)s you are %(age)s years old" % locals()
"hello {name}s you are {age}s years old".format(**locals())
"hello {name}s you are {age}s years old".format(name=name, age=age)
faites juste ceci:
f"hello {name}s you are {age}s years old"
Voici l'exemple officiel:
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
Référence:
Si la chaîne de format n'est pas fournie par l'utilisateur, cette utilisation est correcte.
format
est préférable à l'utilisation de l'ancien %
pour la substitution de chaîne.locals
est intégré à Python et son comportement sera fiable.
Je pense que locals
fait exactement ce dont vous avez besoin.
Ne modifiez simplement pas le dictionnaire à partir des locaux et je dirais que vous avez une assez bonne solution.
Si la chaîne de format est fournie par l'utilisateur, vous êtes susceptible de subir des attaques par injection de toutes sortes de problèmes.
C'est très ancien, mais si vous vous retrouvez à utiliser .format
la seule mise en garde que j'ai rencontrée en passant **locals
est que si vous n'avez défini cette variable nulle part, elle se cassera. Le fait d'indiquer explicitement quelles variables sont transmises évitera cela dans la plupart des IDE modernes.
foo = "bar"
"{foo} and {baz} are pair programming".format(**locals())
<exception occurs>