Python >> Tutoriel Python >  >> Python Tag >> exec()

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

💬 Question :Supposons que vous ayez une expression que vous souhaitez exécuter en utilisant le exec() 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 exec() fonction :

Récapituler Python exec()

exec() de Python La fonction exécute le code Python que vous transmettez en tant qu'argument de chaîne ou d'objet exécutable.

C'est ce qu'on appelle l'exécution dynamique car, contrairement à la norme statique Code Python, vous pouvez générer du code et l'exécuter lors de l'exécution.

De cette façon, vous pouvez exécuter du code Python créé par programme.

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

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

Méthode 1 :Définir une variable dans la représentation sous forme de chaîne du code

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() . Vous pouvez l'utiliser dans le code comme s'il faisait partie du code source d'origine.

Méthode 2 :comment remplacer la valeur d'une variable dans exec()

Pour remplacer une variable définie en dehors du exec() appel de fonction, vous pouvez simplement le faire en utilisant une f-string et transmettre la nouvelle valeur comme côté droit de l'opérateur d'affectation dans la représentation sous forme de chaîne du code à exécuter.

Voici un exemple minimal où nous écrasons le old_variable avec la nouvelle chaîne 'hello finxter' en utilisant l'expression :

exec(f'old_variable = "{new_string}"')

old_variable = 'hello world'
new_string = 'hello finxter'

# Replace old_old variable with new string 'hello finxter'
exec(f'old_variable = "{new_string}"')

print(old_variable)
# hello finxter

Méthode 3 :Comment remplacer la variable globale dans exec() ?

Si vous utilisez l'approche précédente pour remplacer une variable globale définie en dehors du exec() expression appelée dans un contexte local, l'opérateur d'affectation travaillera sur une variable d'alias locale .

La variable globale à remplacer restera la même !

Cela peut être vu dans l'exemple de code suivant, où le old_variable global n'est pas remplacé par la nouvelle chaîne 'hello finxter' à cause de la portée locale de la fonction f qui crée son propre espace de noms avec son propre old_variable qui éclipse le old_variable global .

old_variable = 'hello world'
new_string = 'hello finxter'

def f():
    # Replace old_old variable with new string 'hello finxter'
    exec(f'old_variable = "{new_string}"')

f()

print(old_variable)
# hello world

Pour écraser une variable globale dans le exec() fonction, utilisez le global mot-clé, suivi d'un espace vide, du nom de la variable globale, d'un point-virgule ; pour fermer l'instruction, et l'expression pour écraser la variable globale comme ceci :exec(f'global old_variable; old_variable = "{new_string}"')

Voici l'exemple complet :

old_variable = 'hello world'
new_string = 'hello finxter'

def f():
    # Replace old_old variable with new string 'hello finxter'
    exec(f'global old_variable; old_variable = "{new_string}"')


f()

print(old_variable)
# hello finxter

Tutoriel associé :

  • Comment utiliser des variables globales dans une fonction Python ?

Méthode 4 :rediriger la sortie standard

D'accord, faisons quelque chose de fou, d'accord ? 🤯

Redirigeons la sortie standard et imprimons directement dans la variable !

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

  • exec('print(2+2)')
  • exec('print([1, 2, 3, 4] + [5, 6])')
  • exec('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 exec() expression here
exec(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())
# VARIABLE: 4

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 exec() expression car vous pouvez toujours ajouter artificiellement le print() déclaration autour de l'expression originale comme suit :

  • exec('2+2') devient exec('print(2+2)')
  • exec('2+2*0') devient exec('print(2+2*0)')
  • exec('[1, 2, 3] + [4, 5]') devient exec('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 exec() expression dans une variable.

👀 Article connexe : Comment affecter le résultat de eval() à une variable Python ?