Python >> Tutoriel Python >  >> Python

Comment affecter le résultat de eval() à une variable Python ?

💬 Question :Supposons que vous ayez une expression que vous souhaitez exécuter en utilisant le eval() fonction. Comment stocker le résultat de l'expression dans une variable Python my_result ?

Avant de vous montrer la solution, récapitulons rapidement le eval() fonction :

Récapituler Python eval()

Python eval(s) analyse l'argument de chaîne s dans une expression Python, l'exécute et renvoie le résultat de l'expression.

Tutoriel associé :eval() de Python fonction intégrée

Sans plus tarder, apprenons comment vous pouvez stocker le résultat du eval() fonction dans une variable Python :

Méthode 1 :Affectation simple

La façon la plus simple de stocker le résultat d'un eval() expression dans une variable Python consiste à affecter la valeur de retour entière à la variable. Par exemple, l'expression my_result = eval('2+2') stocke le résultat 4 dans la variable my_result .

Voici un exemple minimal :

my_result = eval('2+2')
print(my_result)
# 4

Cette approche simple peut ne pas toujours fonctionner, par exemple, si vous avez un print() déclaration dans l'expression.

Lisez la suite pour savoir comment résoudre ce problème et apprendre quelque chose de nouveau !

Méthode 2 :rediriger la sortie standard

Cette méthode suppose que vous avez un print() déclaration dans l'expression passée dans le eval() fonction telle qu'illustrée dans les trois exemples suivants :

  • eval('print(2+2)')
  • eval('print([1, 2, 3, 4] + [5, 6])')
  • eval('print(2+2*0)')

Pour obtenir la sortie et la stocker dans une variable my_result , vous devez temporairement rediriger la sortie standard vers la variable.

Le code suivant vous montre comment accomplir exactement cela :

# Step 1: Import libraries StringIO and sys
from io import StringIO
import sys

# Step 2: Keep stdout in temporary variable
tmp = sys.stdout

# Step 3: Capture standard output using a StringIO object
my_result = StringIO()

# Step 4: Assign Standard Output Stream to StringIO object
sys.stdout = my_result

# Step 5: Print to the standard output
expression = 'print(2+2)' # any eval() expression here
eval(expression)

# Step 6: Clean up by redirecting stdout to Python shell
sys.stdout = tmp

# Step 7: Get and print the string from stdout
print('VARIABLE:', my_result.getvalue())
# hello world

Si vous avez besoin d'aide pour comprendre toute cette idée de redirection de la sortie standard, consultez notre guide détaillé sur le blog Finxter.

👀 Article connexe : 7 étapes faciles pour rediriger votre sortie standard vers une variable (Python)

Notez que cette approche fonctionne même si vous n'avez pas de print() déclaration dans l'original eval() expression car vous pouvez toujours ajouter artificiellement le print() déclaration autour de l'expression originale comme suit :

  • eval('2+2') devient eval('print(2+2)')
  • eval('2+2*0') devient eval('print(2+2*0)')
  • eval('[1, 2, 3] + [4, 5]') devient eval('print([1, 2, 3] + [4, 5])')

Même si c'est un peu maladroit, après avoir appliqué cette petite astuce, vous pouvez rediriger la sortie standard et stocker le résultat de tout eval() expression dans une variable.

Méthode 3 :Utiliser exec()

Utiliser uniquement le eval() de Python fonction, vous ne pouvez pas définir de variables à l'intérieur de l'expression à évaluer. Cependant, vous pouvez définissez une variable dans le exec() fonction qui sera ensuite ajouté à l'espace de noms global. Ainsi, vous pouvez accéder à la variable définie dans votre code après la terminaison du exec() expression !

Voici comment cela fonctionne dans un exemple minimal :

exec('my_result = 40 + 2')
print(my_result)
# 42

Variable my_result n'est défini que dans l'expression de chaîne passée dans exec() , mais vous pouvez l'utiliser dans le code comme s'il faisait partie du code source d'origine.

Récapituler exec() vs eval()

exec() de Python La fonction prend un programme Python, sous forme de chaîne ou d'objet exécutable, et l'exécute. Le eval() La fonction évalue une expression et renvoie le résultat de cette expression. Il existe deux différences principales :

  • exec() peut exécuter tout le code source Python, alors que eval() ne peut évaluer que des expressions.
  • exec() renvoie toujours None , alors que eval() renvoie le résultat de l'expression évaluée.
  • exec() peut importer des modules, alors que eval() ne peut pas.

Vous pouvez en savoir plus sur le exec() fonction ici :

  • Article connexe : Python exec() — Guide du hacker pour une fonction dangereuse