Comment évaluer une variable en tant que f-string?

Je voudrais avoir un mécanisme qui évalue une f-string où le contenu à évaluer est fourni à l'intérieur d'une variable. Par example,

x=7
s='{x+x}'
fstr_eval(s)

Pour le cas d'utilisation que j'ai à l'esprit, la chaîne speut provenir de l'entrée de l'utilisateur (où l'utilisateur est approuvé avec eval).

Bien que l'utilisation evalen production soit généralement une très mauvaise pratique, il existe des exceptions notables. Par exemple, l'utilisateur peut être un développeur Python, travaillant sur une machine locale, qui souhaite utiliser la syntaxe Python complète pour développer des requêtes SQL.

Remarque sur la duplication : il existe des questions similaires ici et ici. La première question a été posée dans le contexte limité des modèles. La deuxième question, bien que très similaire à celle-ci, a été marquée comme doublon. Étant donné que le contexte de cette question est très différent de la première, j'ai décidé de poser cette troisième question sur la base des conseils générés automatiquement après la deuxième question :

Cette question a déjà été posée et a déjà une réponse. Si ces réponses ne répondent pas entièrement à votre question, veuillez poser une nouvelle question.


Solution du problème

Même avec un utilisateur de confiance, l'utilisation evalne devrait être qu'un tout dernier recours.

Si vous êtes prêt à sacrifier la flexibilité de votre syntaxe pour un peu plus de sécurité et de contrôle, vous pouvez l'utiliser str.formatet lui fournir toute votre portée.

Cela interdira l'évaluation des expressions, mais des variables uniques seront formatées dans la sortie.

Code

x = 3
y = 'foo'
s = input('> ')
print(s.format(**vars()))

Exemple

> {x} and {y}
3 and foo

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"