English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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)
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.
L'objet retourné par la méthode eval() estexpressionRésultat de l'évaluation.
x = 1 print(eval('x)) + 1))
When running the program, the output is:
2
Ici, eval() calcule l'expression x + 1et l'imprimer.
# 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
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'
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é.
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()'))
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.
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__
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.
You can limit __builtins__ as follows:In the expression (expression),usage:
eval(expression, {'__builtins__': None})
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.