web-dev-qa-db-fra.com

Utilisation des méthodes locals () et format () pour les chaînes: y a-t-il des mises en garde?

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)
47

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:

26
Jacktose

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.

29
Prashant Kumar

Pre Python 3.6 réponse

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>
2
Pureferret