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

Python Grundtutorials

Python Prozesssteuerung

Funktionen in Python

Datentypen in Python

Python Dateioperationen

Python Objekte und Klassen

Python Datum und Zeit

Erweiterte Python-Kenntnisse

Python Referenzhandbuch

Verwendung und Beispiele von Python eval()

Python-integrierte Funktionen

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() Parameter

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() Rückgabewert

eval() gibt zurück vonexpressionErgebnis der Auswertung.

Beispiel1Wie funktioniert eval() in Python?

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.

Beispiel2: Ein Beispiel zur Demonstration der Verwendung von eval()

# 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

Warum sollte man vorsichtig mit eval() umgehen?

Ü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'

限制在eval()中使用可用的方法和变量

通常,可能不需要使用Ausdruck(eval()的第一个参数)中使用的所有可用方法和变量,甚至可能有安全漏洞。您可能需要限制将这些方法和变量用于eval()。您可以通过将可选的globalsundlocals参数(字典)传递给eval()方法来实现。

1.当省略globals和locals参数时

如果两个参数都被省略(如前面的示例所示),则在当前范围内执行该Ausdruck。您可以使用以下代码检查可用的变量和方法:

print(eval('dir()'))

2.传递全局参数;省略locals参数

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.

Beschränkung der Verwendung von __builtins__

Sie können __builtins__ wie folgt beschränken:im Ausdruck (expression)Verwendung:

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

3.Durch globale und lokale Dictionary

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.

Python-integrierte Funktionen