English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Python

Contrôle de flux Python

Fonctions en Python

Types de données en Python

Opérations de fichiers Python

Objets et classes Python

Dates et heures Python

Connaissances avancées Python

Manuel de référence Python

Utilisation et exemples de la méthode eval() en Python

Python built-in functions

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

En résumé, la méthode eval() exécute du code Python (passé en paramètre) dans le programme.

La syntaxe de eval() est :

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

Paramètres de eval()

eval() a trois paramètres :

  • expression-Analyse et évaluation des chaînes de caractères en tant qu'expressions Python

  • globals(Optionnel)-Dictionnaire

  • locals(Optionnel)-Objet de correspondance. Le dictionnaire est un type de correspondance standard couramment utilisé en Python.

Ce sujet sera discuté plus tard dans cet article.Variables globales (globals)andLocalVariables (locals)Utilisation.

La valeur retournée par eval()

L'objet retourné par la méthode eval() estexpressionRésultat de l'évaluation.

example1Comment fonctionne l'évaluation en Python ?

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

When running the program, the output is:

2

Ici, eval() calcule l'expression x + 1et l'imprimer.

example2: Exemple réel de l'utilisation de eval()

# Périmètre du carré
def calculatePerimeter(l):
  return 4*l
# Carré du périmètre
def calculateArea(l):
  return l*1
property = input("Entrez la fonction à utiliser : ")
for l in range(1, 5)
    if (property == 'calculatePerimeter(l)'):
        print("Si la longueur est", l,", périmètre =", eval(property))
    elif (property == 'calculateArea(l)'):
        print("Si la longueur est", l,", surface =", eval(property))
    else:
      print('Fonction incorrecte')
      break

La sortie du programme ci-dessus sera :

Entrez la fonction à utiliser : calculatePerimeter(l)
Si la longueur est  1 , périmètre =  4
Si la longueur est  2 , périmètre =  8
Si la longueur est  3 , périmètre =  12
Si la longueur est  4 , périmètre =  16

Pourquoi faut-il être prudent lors de l'utilisation de eval() ?

Considérez un cas où vous utilisez un système Unix (macOS, Linux, etc.) et avez importé le module os. Le module os fournit des méthodes portables pour utiliser les fonctionnalités du système d'exploitation, telles que : lire ou écrire des fichiers.

Si l'utilisateur est autorisé à utiliser eval(input()) pour entrer des valeurs, l'utilisateur peut exécuter des commandes pour modifier le fichier, ou même utiliser command pour supprimer tous les fichiers os.system('rm) -rf *)

Si eval(input()) est utilisé dans le code, il est préférable de vérifier les variables et les méthodes que l'utilisateur peut utiliser. Vous pouvez utiliserMéthode dir()Voir les variables et les méthodes disponibles.

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

Lorsque vous exécutez ce programme, la sortie sera similaire à :

__annotations__, __builtins__, __doc__, __file__, __loader__, __name__, __package__, __spec__, acos, acosh, asin, asinh, atan, atan2atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log'10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'squareRoot', 'tan', 'tanh', 'tau', 'trunc'

Restreindre les méthodes et variables disponibles dans eval()

En règle générale, il n'est peut-être pas nécessaire d'utiliserexpression(Le premier paramètre de eval()) de toutes les méthodes et variables disponibles utilisées, même s'il peut y avoir des vulnérabilités de sécurité. Vous pourriez avoir besoin de limiter l'utilisation de ces méthodes et variables avec eval(). Vous pouvez le faire en utilisant l'optionnelglobalsandlocalsParamètre (dictionnaire) est transmis à la méthode eval() pour être réalisé.

1.Lorsque les paramètres globals et locals sont omis

Si les deux paramètres sont omis (comme dans l'exemple précédent), l'exécution a lieu dans la portée actuelleexpression.Vous pouvez utiliser le code suivant pour vérifier les variables et méthodes disponibles :

print(eval('dir()'))

2.Transmettre les paramètres globaux ; omettre le paramètre locals

globals et localsParamètre(Dictionnaire), utilisé respectivement pour les variables globales et locales. Si le paramètre est omislocalsDictionnaire, il est par défautglobalsDictionnaire. Cela signifie que,globalsSera utilisé pour les variables globales et locales.

Attention :Vous pouvez utiliser séparémentglobals()andlocals()Les méthodes intégrées dans Python vérifient le dictionnaire global et local actuels.

Transmettre un dictionnaire vide en tant que paramètre global

from math import *
print(eval('dir()', {}))

# print(eval('sqrt(25)

Si un dictionnaire vide est utilisé commeglobalsTransmise, seul __builtins__ peut être utilisé dans l'expression (expression) (le premier paramètre de eval()). Même si nous avons importé le module math dans le programme ci-dessus,Expression (expression)Ne peut pas non plus accéderModule mathToute fonction fournie.

When running the program, the output is:

__builtins__

Fournir certains méthodes disponibles

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

Here, the expression can also use sqrt() and pow() methods as well as __builtins__.

Additionally, you can change the methods available for useexpression(expression) method name.

from math import *
print(eval('dir()', {'squareRoot': sqrt, 'pow': pow}))
# Use square root in the expression
print(eval('squareRoot(9)

In the above program, squareRoot() calculates the square root (similar functions, such as sqrt()). However, attempting to use sqrt() will cause an error.

Limit the use of __builtins__

You can limit __builtins__ as follows:In the expression (expression),usage:

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

3.Through global and local dictionaries

You can passlocal(locals) dictionary to make the required functions and variables available. For example:

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

When running the program, the output is:

 2.23606797749979

In this program,expression(expression)(the first parameter of eval) can only have sqrt() methods and variablesa.All other methods and variables are not available.

by passingglobalsandlocalsRestricting the use of eval() with a dictionary will make your code safe, especially when using input provided to the eval() method by the user.

Python built-in functions