So verwenden Sie Eval- und Exec -Funktionen in Python

So verwenden Sie Eval- und Exec -Funktionen in Python

In diesem Artikel wird eine Anleitung zur Verwendung von „Eval “- und„ Exec “-Funktionen behandelt, die in der Standard -Python -Bibliothek verfügbar sind. Diese Funktionen können auf verschiedene Weise verwendet werden, um Python -Ausdrücke zu bewerten und auszuführen. Die Verwendung dieser beiden Funktionen kann am besten anhand von Beispielen verstanden werden. Einige Beispiele sind unten aufgeführt. Alle Codeproben in diesem Artikel werden mit Python 3 getestet.9.5 auf Ubuntu 21.04.

Verwenden von Eval, um Python -Ausdrücke zu bewerten

Die Eval -Funktion kann verwendet werden, um Python -Ausdrücke zu bewerten und einen Rückgabewert von ihnen zu erhalten. Jeder Python -Ausdruck, der bewertet werden muss. Ausdrücke, die als Argument an die Evalfunktionen übergeben wurden. Schauen Sie sich das Code -Beispiel unten an:

n = 1
result = eval ("n * 2")
Druck (Ergebnis)
Eval ("Print (n * 2)")

Dreiere Zitate im obigen Beispiel werden verwendet, um Zeichenfolgen „wie es ist“ zu präsentieren, ohne Sonderzeichen zu entkommen oder andere Modifikationen vorzunehmen. Die erste Anweisung in der Code -Probe definiert eine Variable, die als „n“ mit einem Wert von 1 bezeichnet wird. Als Nächst. Im String -Ausdruck wurde Variable „N“ bezeichnet, da sie bereits im Namespace verfügbar ist. Die nächste Anweisung druckt die Ausgabe der Variablen „Ergebnis“ aus. Die letzte Aussage zeigt, dass Sie in dem Ausdruck in die EV-Funktion als Argument direkt integrierte Pythonfunktionen aufrufen können.

Nachdem Sie das obige Code -Beispiel ausgeführt haben, sollten Sie die folgende Ausgabe erhalten:

2
2

Wie Sie im obigen Ausgang sehen können, ergeben beide Druckanweisungen das gleiche Ergebnis.

Sie können optional benutzerdefinierte Wörterbücher für globale und lokale Namespaces angeben, um zulässige Namespace -Objekte einzuschränken und zu steuern. Schauen Sie sich das Code -Beispiel unten an:

n = 1
result = eval ("n * 2")
Druck (Ergebnis)
eval ("print (m * 2)", 'm': 1)
eval ("print (n * 2)", 'm': 1)

In der Evaler -Erklärung in der vierten Zeile wird ein zusätzliches Argument geliefert, in dem ein Wörterbuch von benutzerdefinierten globalen Namespace -Objekten verwendet wird. Wenn Sie ein Wörterbuch von benutzerdefinierten globalen Objekten liefern, werden nur integrierte Methoden und Zuordnungen, die im Wörterbuch enthalten sind. Wenn Sie ein leeres globales Wörterbuch („“) verwenden, sind nur integrierte Methoden zulässig und nicht einmal benutzerdefinierte Importe. Da das „M“ -Objekt im globalen Wörterbuch einen Wert von 1 hat, kann die Bewertungsanweisung eine Referenz für „M“ verwenden. In der letzten Aussage ist im globalen Wörterbuch, aber nicht im „N“ -Variablen, als individuelles Wörterbuch von globalen Objekten verfügbar. Die letzte Aussage macht einen Fehler, da es für „N“ im benutzerdefinierten globalen Namespace -Wörterbuch keine Definition gibt.

Nachdem Sie das obige Code -Beispiel ausgeführt haben, sollten Sie die folgende Ausgabe erhalten:

2
2
Traceback (letzte Anruflast):
Datei "/home/user/downloads/./prüfen.py ", Zeile 7, in
eval ("print (n * 2)", 'm': 1)
Datei "", Zeile 1, in
NameError: Name 'N' ist nicht definiert

Sie können ein Wörterbuch für lokale Namespace -Objekte genauso wie globale Namespace -Objekte verwenden. Geben Sie einfach ein benutzerdefiniertes Wörterbuch als drittes Argument für die EV -Funktion an, um es als Zuordnung für lokale Namespace -Objekte zu verwenden.

Verwenden von Exec zum Ausführen von Python -Code

Die EXEC -Funktion funktioniert ähnlich der EV -Funktion mit einigen Unterschieden. Der an die EXEC -Funktion gelieferte Ausdruck kann eine Zeichenfolge oder ein anderes gültiges Python -Objekt sein, das einen gültigen Python -Code enthält. Im Vergleich dazu nimmt die EV -Funktion nur String -Ausdrücke an. Sie können auch benutzerdefinierte Wörterbücher sowohl für globale als auch für lokale Namespace -Objekte liefern, und die EXEC -Methode verhält sich genauso wie die EV -Funktion, wenn benutzerdefinierte Namespace -Zuordnungen verwendet werden. Ein weiterer Unterschied bei der Eval -Funktion besteht darin, dass die EXEC -Funktion immer einen "None" -Wert zurückgibt. Schauen Sie sich das Code -Beispiel unten an:

n = 1
result = exec ("n * 2")
Druck (Ergebnis)
exec ("print (n * 2)")
result = "print (n * 2)"
Exec (Ergebnis)

Der Codeblock ist dem im Beispiel verwendeten Code -Beispiel sehr ähnlich. Nachdem Sie das obige Code -Beispiel ausgeführt haben, sollten Sie die folgende Ausgabe erhalten:

Keiner
2
2

Wie bereits erwähnt, gibt die EXEC -Funktion immer einen "None" -Wert zurück, sodass die dritte Zeile als Ausgabe „keine“ erzeugt. Als Nächst. Den Ergebnisvariablen wird dann einen neuen Wert zugewiesen, indem sie eine gültige Python -Code -Anweisung in Zeichenfolge Formgeben hat. Die letzte Anweisung zeigt, dass die EXEC -Funktion direkt auf Codeobjekte aufrufen kann, die einen gültigen Python -Code enthalten. Es erzeugt auch „2“ als Ausgang.

Sicherheitsüberlegungen

Bei Verwendung von Eval- und Exec -Funktionen sollten Sie sich bewusst sein, dass diese beiden Funktionen die Ausführung willkürlicher Python -Ausdrücke und Codeblöcke ermöglichen. Wenn Sie sich nicht bewusst sind, was in Ausdrücken verwendet wird, können diese Aussagen der Umgebung schaden, in der Sie arbeiten. Zum Beispiel können Sie unbeabsichtigt ändere, entfernen oder vornehmen, um die auf dem Host gespeicherten Dateien mithilfe der Module „OS“ und „SYS“ und deren Methoden in Eval- und Exec -Funktionen zu entfernen oder vorzunehmen oder vorzunehmen oder vorzunehmen. Mit dem „Subprozess“ -Modul in Python können Sie neue Prozesse starten und Shell -Befehle ausführen. Ausdrücke in Eval- und Exec -Methoden, die das Subprozessmodul verwenden, können zu unbeabsichtigten Verhaltensweisen führen, wenn Sie nicht vorsichtig sind.

Abschluss

Sowohl EV -Methoden als auch EXEC -Methoden ermöglichen es Ihnen, Python -Code -Stücke zu verarbeiten und auszuführen. Sie können Eval -Aussagen an andere Python -Funktionen als Argumente liefern, da sie immer einen Wert zurückgeben, der Lambda -Funktionen in Python etwas ähnlich ist. In ähnlicher Weise können Sie die EXEC -Funktion verwenden, um vordefinierten Python -Code auszuführen. Es wird am häufigsten verwendet, wenn Python -Code aus einer Datei gelesen und in einer anderen ausgeführt werden muss.