Python eval ()

La méthode eval () analyse l'expression passée à cette méthode et exécute l'expression Python (code) dans le programme.

En termes simples, la eval()fonction exécute le code python (qui est passé en argument) dans le programme.

La syntaxe de eval()est:

 eval (expression, globals = None, locaux = None)

Paramètres eval ()

La eval()fonction prend trois paramètres:

  • expression - la chaîne analysée et évaluée en tant qu'expression Python
  • globals (facultatif) - un dictionnaire
  • locals (facultatif) - un objet de mappage. Dictionary est le type de mappage standard et couramment utilisé en Python.

L'utilisation des globaux et des locaux sera abordée plus loin dans cet article.

Valeur renvoyée par eval ()

La méthode eval () renvoie le résultat évalué à partir de l'expression.

Exemple 1: Comment fonctionne eval () en Python

 x = 1 print(eval('x + 1'))

Production

 2

Ici, la eval()fonction évalue l'expression x + 1et printest utilisée pour afficher cette valeur.

Exemple 2: Exemple pratique pour démontrer l'utilisation de eval ()

 # Perimeter of Square def calculatePerimeter(l): return 4*l # Area of Square def calculateArea(l): return l*l expression = input("Type a function: ") for l in range(1, 5): if (expression == 'calculatePerimeter(l)'): print("If length is ", l, ", Perimeter = ", eval(expression)) elif (expression == 'calculateArea(l)'): print("If length is ", l, ", Area = ", eval(expression)) else: print('Wrong Function') break

Production

 Tapez une fonction: CalculateArea (l) Si la longueur est 1, Area = 1 Si la longueur est 2, Area = 4 Si la longueur est 3, Area = 9 Si la longueur est 4, Area = 16

Avertissements lors de l'utilisation de eval ()

Considérez une situation où vous utilisez un système Unix (macOS, Linux, etc.) et que vous avez importé le osmodule. Le module os fournit un moyen portable d'utiliser les fonctionnalités du système d'exploitation telles que la lecture ou l'écriture dans un fichier.

Si vous permettez aux utilisateurs d'entrer une valeur à l' aide eval(input()), l'utilisateur peut envoyer des commandes au fichier de modifier ou de supprimer tous les fichiers , même en utilisant la commande: os.system('rm -rf *').

Si vous utilisez eval(input())dans votre code, c'est une bonne idée de vérifier les variables et méthodes que l'utilisateur peut utiliser. Vous pouvez voir quelles variables et méthodes sont disponibles en utilisant la méthode dir ().

 from math import * print(eval('dir()'))

Production

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' comb ',' copysign ',' cos ',' cosh ',' degrés ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radians ',' reste ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Restreindre l'utilisation des méthodes et variables disponibles dans eval ()

Le plus souvent, toutes les méthodes et variables disponibles utilisées dans l'expression (premier paramètre à eval()) peuvent ne pas être nécessaires, ou même avoir une faille de sécurité. Vous devrez peut-être restreindre l'utilisation de ces méthodes et variables pour eval(). Vous pouvez le faire en passant des paramètres globaux et locaux facultatifs (dictionnaires) à la eval()fonction.

1. Lorsque les paramètres globaux et locaux sont omis

Si les deux paramètres sont omis (comme dans nos exemples précédents), l'expression est exécutée dans la portée actuelle. Vous pouvez vérifier les variables et méthodes disponibles à l'aide du code suivant:

 print(eval('dir()')

2. Passer le paramètre globals; le paramètre local est omis

Les paramètres globaux et locaux (dictionnaires) sont utilisés respectivement pour les variables globales et locales. Si le dictionnaire local est omis, il utilise par défaut le dictionnaire global. Cela signifie que les globaux seront utilisés pour les variables globales et locales.

Remarque: Vous pouvez vérifier le dictionnaire global et local actuel en Python en utilisant respectivement les méthodes intégrées globals () et locals ().

Exemple 3: Passer un dictionnaire vide en tant que paramètre global

 from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))

Production

 ('__builtins__') Traceback (dernier appel le plus récent): Fichier "", ligne 5, en impression (eval ('sqrt (25)', ())) Fichier "", ligne 1, dans NameError: nom 'sqrt' n'est pas défini

Si vous passez un dictionnaire vide sous forme de globaux, seuls les __builtins__sont disponibles pour expression(premier paramètre du eval()).

Même si nous avons importé le mathmodule dans le programme ci-dessus, expression ne peut accéder à aucune des fonctions fournies par le module mathématique.

Exemple 4: Rendre certaines méthodes disponibles

 from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))

Production

 ('__builtins__', 'pow', 'sqrt')

Ici, l'expression ne peut utiliser sqrt()que les pow()méthodes et avec __builtins__.

Il est également possible de changer le nom de la méthode disponible pour l'expression selon votre souhait:

 from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))

Production

 ('__builtins__', 'power', 'square_root') 3.0

Dans le programme ci-dessus, square_root()calcule la racine carrée en utilisant sqrt(). Cependant, essayer d'utiliser sqrt()directement provoquera une erreur.

Exemple 5: restriction de l'utilisation des éléments intégrés

Vous pouvez restreindre l'utilisation de __builtins__dans l'expression comme suit:

 eval(expression, ('__builtins__': None))

3. Passer à la fois le dictionnaire global et local

Vous pouvez rendre les fonctions et les variables nécessaires disponibles pour une utilisation en passant le dictionnaire local. Par exemple:

 from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))

Production

 13,0

Dans ce programme, l'expression ne peut avoir que la sqrt()méthode et la variable a. Toutes les autres méthodes et variables ne sont pas disponibles.

Restreindre l'utilisation de eval()en passant des dictionnaires globaux et locaux rendra votre code sécurisé, en particulier lorsque vous utilisez l'entrée fournie par l'utilisateur à la eval()méthode.

Remarque: Parfois, eval()n'est pas sécurisé même avec des noms limités. Lorsqu'un objet et ses méthodes sont rendus accessibles, presque tout peut être fait. Le seul moyen sécurisé est de valider l'entrée de l'utilisateur.

Articles intéressants...