2396 Stimmen

Aufruf einer Funktion eines Moduls mit Hilfe seines Namens (einer Zeichenkette)

Was ist der beste Weg, um eine Funktion aufzurufen, wenn man eine Zeichenkette mit dem Namen der Funktion in einem Python-Programm hat. Nehmen wir zum Beispiel an, dass ich ein Modul habe foo und ich habe eine Zeichenkette mit folgendem Inhalt "bar" . Wie kann ich am besten anrufen? foo.bar() ?

Ich muss den Rückgabewert der Funktion erhalten, weshalb ich nicht einfach eval . Ich habe herausgefunden, wie man das macht, indem man eval um eine temporäre Funktion zu definieren, die das Ergebnis dieses Funktionsaufrufs zurückgibt, aber ich hoffe, dass es einen eleganteren Weg gibt, dies zu tun.

8 Stimmen

Die Verwendung von eval würde wahrscheinlich einige Sicherheitsbedenken aufwerfen!

23 Stimmen

Zu Ihrer Information: Das Sprachmerkmal des Zugriffs auf Felder, Klassen und Methoden durch dynamische Namen heißt Reflexion . Das könnte die künftige Suche erleichtern.

3voto

Bowen 404 Punkte 82

Ich stehe vor einem ähnlichen Problem, das darin besteht, eine Zeichenfolge in eine Funktion zu konvertieren. aber ich kann nicht verwenden eval() ou ast.literal_eval() weil ich diesen Code nicht sofort ausführen möchte.

z.B. habe ich eine Zeichenkette "foo.bar" und ich möchte sie zuweisen an x als Funktionsname anstelle einer Zeichenkette, d.h. ich kann die Funktion aufrufen durch x() AUF ANFRAGE .

Hier ist mein Code:

str_to_convert = "foo.bar"
exec(f"x = {str_to_convert}")
x()

Was Ihre Frage betrifft, müssen Sie nur den Namen Ihres Moduls hinzufügen foo et . vor {} wie folgt:

str_to_convert = "bar"
exec(f"x = foo.{str_to_convert}")
x()

WARNUNG!!! entweder eval() ou exec() eine gefährliche Methode ist, sollten Sie sich von der Sicherheit überzeugen. WARNUNG!!! entweder eval() ou exec() eine gefährliche Methode ist, sollten Sie sich von der Sicherheit überzeugen. WARNUNG!!! entweder eval() ou exec() eine gefährliche Methode ist, sollten Sie sich von der Sicherheit überzeugen.

1 Stimmen

eval() kann hier verwendet werden anstelle von exec() und würde den Code wahrscheinlich geringfügig lesbarer machen: Verwenden Sie einfach x = eval(str_to_convert) um das gleiche Ergebnis zu erzielen.

0 Stimmen

@Lecdi ja, du hast recht! und das macht die Variable auch für die folgenden Codes sichtbar. danke!

0 Stimmen

@Lecdi aber exec könnte mir erlauben, eine Reihe von Variablen mit verschiedenen Namen zu definieren, wie exec(f "x{i} = {i}"), was eval nicht kann.

-2voto

Franz Kurt Punkte 611

Das bedeutet, dass Sie den Zeiger auf eine innere Funktion aus einem Modul erhalten

import foo
method = foo.bar
executed = method(parameter)

Dies ist kein besserer pythonischer Weg, ist aber für punktuelle Fälle möglich

1 Stimmen

Dies beantwortet jedoch nicht die Frage des Auftraggebers, da man diese Methode nicht anwenden kann, wenn "bar" wird als Zeichenkette gespeichert...

-16voto

Number File Punkte 191

Dies ist eine einfache Antwort, mit der Sie zum Beispiel den Bildschirm löschen können. Unten finden Sie zwei Beispiele mit eval und exec, die nach dem Aufräumen oben 0 ausgeben (wenn Sie Windows verwenden, ändern Sie clear まで cls Linux- und Mac-Benutzer können es so lassen, wie es ist, bzw. es einfach ausführen.

eval("os.system(\"clear\")")
exec("os.system(\"clear\")")

5 Stimmen

Das ist nicht das, was die Operation verlangt.

13 Stimmen

Dieser Codeschnipsel enthält die schlimmsten 2 Sicherheitslücken, die ineinander verschachtelt sind. Eine Art von Aufzeichnung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X