English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
eval() analysiert den Ausdruck, der diesem Methodenaufruf übergeben wird, und führt den Python-Ausdruck (Code) im Programm aus.
Kurz gesagt, eval() führt Python-Code (als Parameter übergeben) im Programm aus.
Die Syntax von eval() ist:
eval(expression, globals=None, locals=None)
eval() hat drei Parameter:
expression-Parsen und als Python-Ausdruck bewerten
globals(Optional)-Dictionary
locals(Optional)-Kartenobjekt. Das Dictionary ist ein häufig verwendeter Standardkarten-Typ in Python.
Dies wird später in diesem Artikel diskutiert.Globale Variable (globals)undLokalVariable (locals)Verwendung.
eval() gibt zurück vonexpressionErgebnis der Auswertung.
x = 1 print(eval('x}} + 1))
Wenn Sie dieses Programm ausführen, die Ausgabe ist:
2
Hier berechnet eval() den Ausdruck x + 1und geben Sie es aus.
# Quadratseitenlänge def calculatePerimeter(l): return 4*l # Quadratfläche def calculateArea(l): return l*1 property = input("Geben Sie die zu verwendende Funktion ein: ") for l in range(1, 5) if (property == 'calculatePerimeter(l)'): print("Wenn die Länge ist ", l, ", Umfang = ", eval(property)) elif (property == 'calculateArea(l)'): print("Wenn die Länge ist ", l, ", Fläche = ", eval(property)) else: print('Fehlerhafte Funktion') break
Die Ausgabe des obigen Programms wird sein:
Geben Sie die zu verwendende Funktion ein: calculatePerimeter(l) Wenn die Länge ist 1 , Umfang = 4 Wenn die Länge ist 2 , Umfang = 8 Wenn die Länge ist 3 , Umfang = 12 Wenn die Länge ist 4 , Umfang = 16
Überlegen Sie sich eine Situation, bei der Sie ein Unix-System (macOS, Linux usw.) verwenden und das os-Modul importiert haben. Das os-Modul bietet eine tragbare Methode zur Verwendung von Betriebssystemfunktionen, z.B.: Dateien lesen oder schreiben.
Wenn dem Benutzer erlaubt wird, eval(input()) zu verwenden, kann der Benutzer Befehle ausführen, um Dateien zu ändern, und kann auch command verwenden, um alle Dateien zu löschen os.system('rm -rf *) verwenden.
Wenn eval(input()) im Code verwendet wird, ist es am besten zu überprüfen, welche Variablen und Methoden der Benutzer verwenden kann. Sie könnendir() MethodeÜberprüfen Sie die verfügbaren Variablen und Methoden.
from math import * print(eval('dir()'))
Wenn Sie das Programm ausführen, ähnelt die Ausgabe:
__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'
通常,可能不需要使用Ausdruck(eval()的第一个参数)中使用的所有可用方法和变量,甚至可能有安全漏洞。您可能需要限制将这些方法和变量用于eval()。您可以通过将可选的globalsundlocals参数(字典)传递给eval()方法来实现。
如果两个参数都被省略(如前面的示例所示),则在当前范围内执行该Ausdruck。您可以使用以下代码检查可用的变量和方法:
print(eval('dir()'))
globals和locals参数(字典),分别用于全局和局部变量。如果省略了locals字典,则默认为globals字典。这意味着,globals将用于全局变量和局部变量。
注意:您可以分别使用globals()undlocals()内置方法在Python中检查当前的全局字典和局部字典。
from math import * print(eval('dir()', {})) # 下面的代码将引发异常 # print(eval('sqrt('25),{}))
如果将空字典作为globals传递,则仅__builtins__可用于表达式(expression)(eval()的第一个参数)。即使我们在上面的程序中导入了math模块,表达式(expression)也无法访问math模块提供的任何功能。
Wenn Sie dieses Programm ausführen, die Ausgabe ist:
'__builtins__'
from math import * print(eval('dir()', {'sqrt': sqrt, 'pow': pow}))
Hier kann der Ausdruck sqrt() und pow() Methoden sowie __builtins__ verwenden.
Außerdem können Sie nach Belieben ändern, welche fürAusdruckMethode (expression) Name.
from math import * print(eval('dir()', {'squareRoot': sqrt, 'pow': pow})) # Verwenden Sie Quadratwurzel im Ausdruck print(eval('squareRoot(9)
Im obigen Programm berechnet squareRoot() die Quadratwurzel (ähnliche Funktionen wie sqrt()). Der Versuch, sqrt() zu verwenden, führt jedoch zu einem Fehler.
Sie können __builtins__ wie folgt beschränken:im Ausdruck (expression)Verwendung:
eval(expression, {'__builtins__': None})
Sie können durch ÜbermittlungLokal(locals) um die erforderlichen Funktionen und Variablen verfügbar zu machen. Zum Beispiel:
from math import * a = 5 print(eval('sqrt(a)', {'__builtins__': None}, {'a': a, 'sqrt': sqrt}))
Wenn Sie dieses Programm ausführen, die Ausgabe ist:
2.23606797749979
In diesem Programm,Ausdruck(Ausdruck)(eval erster Parameter)kann nur sqrt() Methoden und Variablen habena.Alle anderen Methoden und Variablen sind nicht verfügbar.
durch ÜbermittlungglobalsundlocalsEine Liste zu beschränken, die die Verwendung von eval() ermöglicht, macht Ihren Code sicherer, insbesondere wenn Sie den Eingaben von eval() Methoden vertrauen.