Comment utiliser les fonctions EVAL et EXEC dans Python

Comment utiliser les fonctions EVAL et EXEC dans Python

Cet article couvrira un guide sur l'utilisation des fonctions «EVAL» et «EXEC» disponibles dans la bibliothèque Python standard. Ces fonctions peuvent être utilisées de diverses manières pour évaluer et exécuter des expressions Python. L'utilisation de ces deux fonctions peut être mieux comprise à travers des exemples. Quelques exemples sont répertoriés ci-dessous. Tous les échantillons de code de cet article sont testés avec Python 3.9.5 sur Ubuntu 21.04.

Utilisation d'évaluation pour évaluer les expressions Python

La fonction EVAL peut être utilisée pour évaluer les expressions Python et obtenir une valeur de retour d'eux. Toute expression python qui doit être évaluée est fournie à la fonction EVAL sous la forme d'un argument obligatoire. Les expressions transmises comme argument aux fonctions d'évaluation ont un accès complet aux fonctions Python intégrées ainsi qu'aux espaces de noms globaux et locaux. Jetez un œil à l'échantillon de code ci-dessous:

n = 1
Résultat = EVAL ("N * 2")
Imprimer (résultat)
eval ("print (n * 2)")

Les citations triples dans l'exemple ci-dessus sont utilisées pour présenter des chaînes «telles quelles», sans échapper à des caractères spéciaux ni à apporter d'autres modifications. La première instruction de l'échantillon de code définit une variable appelée «n» ayant une valeur de 1. Ensuite, la méthode EVAL est appelée en lui fournissant une expression python au format de chaîne. Dans l'expression de la chaîne, la variable «n» a été référencée car elle est déjà disponible dans l'espace de noms. L'instruction suivante imprime la sortie de la variable «Résultat». La dernière instruction illustre que vous pouvez appeler directement les fonctions Python intégrées dans l'expression fournie à la fonction EVAL comme un argument.

Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

2
2

Comme vous pouvez le voir dans la sortie ci-dessus, les deux instructions d'impression produisent le même résultat.

Vous pouvez éventuellement fournir des dictionnaires personnalisés pour les espaces de noms globaux et locaux pour restreindre et contrôler les objets d'espace de noms autorisés. Jetez un œil à l'échantillon de code ci-dessous:

n = 1
Résultat = EVAL ("N * 2")
Imprimer (résultat)
eval ("print (m * 2)", 'm': 1)
eval ("print (n * 2)", 'm': 1)

Dans l'instruction EVAL dans la quatrième ligne, un argument supplémentaire est fourni lorsqu'un dictionnaire d'objets d'espace de noms mondial personnalisé est utilisé. Lorsque vous fournissez un dictionnaire d'objets mondiaux personnalisés, seules les méthodes et les mappages intégrés inclus dans le dictionnaire sont utilisés par EVAL. Si vous utilisez un dictionnaire global vide («»), seules les méthodes intégrées sont autorisées et même pas les importations personnalisées. Étant donné que l'objet «M» dans le dictionnaire global a une valeur de 1, l'instruction EVAL est capable d'utiliser une référence pour «M». Dans la dernière déclaration, l'objet «M» est disponible dans le dictionnaire mondial, mais pas dans la variable «N», car un dictionnaire personnalisé des objets mondiaux a été fourni. La dernière instruction lancera une erreur car il n'y a pas de définition pour «N» dans le dictionnaire Global Namespace Custom.

Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

2
2
Traceback (dernier appel dernier):
Fichier "/ home / utilisateur / téléchargements /./test.py ", ligne 7, dans
eval ("print (n * 2)", 'm': 1)
Fichier "", ligne 1, dans
Nameerror: le nom 'n' n'est pas défini

Vous pouvez utiliser un dictionnaire pour les objets d'espace de noms locaux de la même manière que les objets d'espace de noms global. Fournissez simplement un dictionnaire personnalisé comme troisième argument pour la fonction EVAL pour l'utiliser comme mappage pour les objets d'espace de noms locaux.

Utilisation de l'exec pour exécuter le code Python

La fonction exec fonctionne similaire à la fonction EVAL avec quelques différences. L'expression fournie à la fonction exec peut être une chaîne ou tout autre objet Python valide qui contient un code Python valide. En comparaison, la fonction EVAL ne prend que des expressions de cordes. Vous pouvez également fournir des dictionnaires personnalisés pour les objets d'espace de noms global et local et la méthode EXEC se comporte de la même manière que la fonction EVAL lorsque les mappages d'espace de noms personnalisés sont utilisés. Une autre différence avec la fonction EVAL est que la fonction EXEC renvoie toujours une valeur «Aucun». Jetez un œil à l'échantillon de code ci-dessous:

n = 1
résultat = exec ("n * 2")
Imprimer (résultat)
exec ("print (n * 2)")
résultat = "print (n * 2)"
exec (résultat)

Le bloc de code est très similaire à l'échantillon de code utilisé dans l'exemple d'évaluation, mais au lieu de la fonction EVAL, maintenant la fonction EXEC a été utilisée. Après avoir exécuté l'échantillon de code ci-dessus, vous devriez obtenir la sortie suivante:

Aucun
2
2

Comme indiqué précédemment, la fonction EXEC renvoie toujours une valeur «aucun», donc la troisième ligne produit «aucune» comme sortie. Ensuite, l'instruction EXEC dans la quatrième ligne utilise la fonction «imprimer» pour produire «2» comme sortie. La variable de résultat se voit ensuite attribuer une nouvelle valeur en lui fournissant une instruction de code python valide dans le formulaire de chaîne. La dernière instruction montre que la fonction EXEC peut appeler directement sur des objets de code contenant du code Python valide. Il produit également «2» comme sortie.

Considérations de sécurité

Lors de l'utilisation des fonctions EVAL et EXEC, vous devez savoir que ces deux fonctions permettent l'exécution d'expressions python et de blocs de code arbitraires. Si vous n'êtes pas consciemment conscient de ce qui est utilisé dans les expressions, ces déclarations peuvent nuire à l'environnement dans lequel vous travaillez. Par exemple, vous pouvez modifier, supprimer ou apporter des modifications irréversibles dans les fichiers stockés sur l'hôte en utilisant les modules «OS» et «SYS» et leurs méthodes dans les fonctions EVAL et EXEC. Le module «Sous-processus» dans Python vous permet de lancer de nouveaux processus et d'exécuter des commandes de shell. Les expressions dans les méthodes d'évaluation et d'exec utilisation du module de sous-processus peuvent conduire à des comportements involontaires si vous ne faites pas attention à ce qui est utilisé dans les expressions.

Conclusion

Les méthodes EVAL et EXEC vous permettent de traiter et d'exécuter des morceaux de code Python. Vous pouvez fournir des instructions d'évaluation à d'autres fonctions Python comme des arguments car ils renvoient toujours une valeur, quelque peu similaire aux fonctions lambda en python. De même, vous pouvez utiliser la fonction EXEC pour exécuter le code Python prédéfini. Il est le plus souvent utilisé où le code Python est nécessaire pour être lu à partir d'un fichier et exécuté dans un autre.