Python eval ()

Die eval () -Methode analysiert den an diese Methode übergebenen Ausdruck und führt den Python-Ausdruck (Code) im Programm aus.

In einfachen Worten, die eval()Funktion führt den Python-Code (der als Argument übergeben wird) innerhalb des Programms aus.

Die Syntax von eval()lautet:

 eval (Ausdruck, global = Keine, Einheimische = Keine)

eval () Parameter

Die eval()Funktion akzeptiert drei Parameter:

  • Ausdruck - Der String, der analysiert und als Python-Ausdruck ausgewertet wird
  • Globals (optional) - ein Wörterbuch
  • Einheimische (optional) - ein Zuordnungsobjekt. Wörterbuch ist der Standard- und häufig verwendete Zuordnungstyp in Python.

Die Verwendung von Globalen und Einheimischen wird später in diesem Artikel erläutert.

Rückgabewert von eval ()

Die eval () -Methode gibt das aus dem Ausdruck ausgewertete Ergebnis zurück.

Beispiel 1: Wie eval () in Python funktioniert

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

Ausgabe

 2

Hier eval()wertet die Funktion den Ausdruck aus x + 1und printwird verwendet, um diesen Wert anzuzeigen.

Beispiel 2: Praktisches Beispiel zur Demonstration der Verwendung von 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

Ausgabe

 Geben Sie eine Funktion ein: berechne Fläche (l) Wenn die Länge 1 ist, Fläche = 1 Wenn die Länge 2 ist, Fläche = 4 Wenn die Länge 3 ist, Fläche = 9 Wenn die Länge 4 ist, Fläche = 16

Warnungen bei Verwendung von eval ()

Stellen Sie sich eine Situation vor, in der Sie ein Unix-System (macOS, Linux usw.) verwenden und das osModul importiert haben . Das Betriebssystemmodul bietet eine tragbare Möglichkeit, Betriebssystemfunktionen wie das Lesen oder Schreiben in eine Datei zu verwenden.

Wenn Sie Benutzern erlauben, einen Wert mit einzugeben eval(input()), kann der Benutzer Befehle zum Ändern der Datei oder sogar zum Löschen aller Dateien mit dem folgenden Befehl ausgeben : os.system('rm -rf *').

Wenn Sie eval(input())in Ihrem Code verwenden, sollten Sie überprüfen, welche Variablen und Methoden der Benutzer verwenden kann. Mit der Methode dir () können Sie sehen, welche Variablen und Methoden verfügbar sind.

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

Ausgabe

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' decken ',' kamm ',' copysign ',' cos ',' cosh ',' grad ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'Fakultät', 'Boden', '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 ',' rest ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Einschränkung der Verwendung verfügbarer Methoden und Variablen in eval ()

In den meisten Fällen werden eval()möglicherweise nicht alle verfügbaren Methoden und Variablen, die im Ausdruck verwendet werden (erster Parameter bis ), nicht benötigt oder weisen sogar eine Sicherheitslücke auf. Möglicherweise müssen Sie die Verwendung dieser Methoden und Variablen für einschränken eval(). Sie können dies tun, indem Sie optionale globale und lokale Parameter (Wörterbücher) an die eval()Funktion übergeben.

1. Wenn sowohl globale als auch lokale Parameter weggelassen wurden

Wenn beide Parameter weggelassen werden (wie in unseren früheren Beispielen), wird der Ausdruck im aktuellen Bereich ausgeführt. Sie können die verfügbaren Variablen und Methoden mit folgendem Code überprüfen:

 print(eval('dir()')

2. Übergeben des globalen Parameters; Der Parameter local wird weggelassen

Die globalen und lokalen Parameter (Wörterbücher) werden für globale bzw. lokale Variablen verwendet. Wenn das lokale Wörterbuch weggelassen wird, wird standardmäßig das globale Wörterbuch verwendet. Das heißt, Globale werden sowohl für globale als auch für lokale Variablen verwendet.

Hinweis: Sie können das aktuelle globale und lokale Wörterbuch in Python mit den integrierten Methoden globals () und local () überprüfen.

Beispiel 3: Übergeben eines leeren Wörterbuchs als globaler Parameter

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

Ausgabe

 ('__builtins__') Traceback (letzter Aufruf zuletzt): Datei "", Zeile 5, im Druck (eval ('sqrt (25)', ())) Datei "", Zeile 1, in NameError: Name 'sqrt' ist nicht definiert

Wenn Sie ein leeres Wörterbuch als Globals übergeben, stehen nur die __builtins__zur Verfügung expression(erster Parameter für eval()).

Obwohl wir das mathModul in das obige Programm importiert haben , kann expression nicht auf Funktionen zugreifen, die vom Mathematikmodul bereitgestellt werden.

Beispiel 4: Bestimmte Methoden zur Verfügung stellen

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

Ausgabe

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

Hier kann der Ausdruck nur sqrt()die pow()Methoden und zusammen mit verwenden __builtins__.

Es ist auch möglich, den Namen der für den Ausdruck verfügbaren Methode nach Ihren Wünschen zu ändern:

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

Ausgabe

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

square_root()Berechnet im obigen Programm die Quadratwurzel mit sqrt(). Der Versuch, sqrt()direkt zu verwenden, führt jedoch zu einem Fehler.

Beispiel 5: Einschränken der Verwendung von integrierten Funktionen

Sie können die Verwendung von __builtins__im Ausdruck wie folgt einschränken :

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

3. Übergeben sowohl des globalen als auch des lokalen Wörterbuchs

Sie können die erforderlichen Funktionen und Variablen zur Verwendung bereitstellen, indem Sie das lokale Wörterbuch übergeben. Beispielsweise:

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

Ausgabe

 13.0

In diesem Programm kann der Ausdruck nur die sqrt()Methode und die Variable a haben. Alle anderen Methoden und Variablen sind nicht verfügbar.

eval()Wenn Sie die Verwendung von globalen und lokalen Wörterbüchern einschränken, wird Ihr Code besonders dann sicher, wenn Sie die vom Benutzer für die eval()Methode bereitgestellten Eingaben verwenden.

Hinweis: Manchmal eval()ist es auch bei eingeschränkten Namen nicht sicher. Wenn ein Objekt und seine Methoden zugänglich gemacht werden, kann fast alles getan werden. Der einzig sichere Weg ist die Überprüfung der Benutzereingaben.

Interessante Beiträge...