Was ist der beste Weg, um eine Funktion mit einem String mit dem Namen der Funktion in einem Python-Programm aufzurufen? Angenommen, ich habe ein Modul foo
und eine Zeichenfolge mit dem Inhalt "bar"
. Wie rufe foo.bar()
ich am besten an ?
Ich muss den Rückgabewert der Funktion erhalten, weshalb ich nicht nur verwende eval
. Ich habe herausgefunden, wie das geht, indem ich eval
eine temporäre Funktion definiert habe, die das Ergebnis dieses Funktionsaufrufs zurückgibt, aber ich hoffe, dass es einen eleganteren Weg gibt, dies zu tun.
foo
Modul können Sie verwenden ,globals()
dies zu tun:methodToCall = globals()['bar']
oder
Einheimische geben ein Wörterbuch mit einer aktuellen lokalen Symboltabelle zurück. globals gibt ein Wörterbuch mit globaler Symboltabelle zurück.
quelle
Patricks Lösung ist wahrscheinlich die sauberste. Wenn Sie das Modul auch dynamisch aufnehmen müssen, können Sie es wie folgt importieren:
quelle
importlib.import_module
. In den offiziellen Dokumenten heißt es__import__
: "Dies ist eine erweiterte Funktion, die im Gegensatz zu importlib.import_module () in der täglichen Python-Programmierung nicht benötigt wird." docs.python.org/2/library/functions.html#__import__importlib.import_module
wird in 3.6 unterstützt. Siehe docs.python.org/3.6/library/…Nur ein einfacher Beitrag. Wenn sich die Klasse, die wir instanziieren müssen, in derselben Datei befindet, können wir Folgendes verwenden:
Zum Beispiel:
Und wenn nicht eine Klasse:
quelle
Bei einer gegebenen Zeichenfolge mit einem vollständigen Python-Pfad zu einer Funktion habe ich das Ergebnis dieser Funktion erhalten:
quelle
__import__
Funktion.Die beste Antwort laut den häufig gestellten Fragen zur Python-Programmierung wäre:
quelle
Die Antwort (ich hoffe) wollte niemand jemals
Eval wie Verhalten
Warum nicht den automatischen Import hinzufügen?
Falls wir zusätzliche Wörterbücher haben, möchten wir diese überprüfen
Wir müssen tiefer gehen
quelle
Wenn Sie den Funktions- (oder Klassen-) Namen und den App-Namen als Zeichenfolge übergeben müssen, können Sie Folgendes tun:
quelle
handler = getattr(sys.modules[__name__], myFnName)
Versuche dies. Während dies immer noch eval verwendet, wird es nur verwendet, um die Funktion aus dem aktuellen Kontext aufzurufen . Dann haben Sie die eigentliche Funktion, die Sie nach Belieben verwenden können.
Der Hauptvorteil für mich besteht darin, dass Sie beim Aufrufen der Funktion alle evalbezogenen Fehler erhalten. Dann erhalten Sie beim Aufruf nur die funktionsbezogenen Fehler.
quelle
eval
sei denn, dies ist unbedingt erforderlich.getattr(__module__, method_name)
ist in diesem Zusammenhang eine viel bessere Wahl.Nichts von dem, was vorgeschlagen wurde, half mir. Ich habe das allerdings entdeckt.
Ich benutze Python 2.66
Hoffe das hilft
quelle
self.__getattribute__('title')
ist gleichself.title
self.__getattribute__('title')
funktioniert in keinem Fall (weiß nicht warum),func = getattr(self, 'title'); func();
tut es aber . Also, vielleicht ist es besser,getattr()
stattdessen zu verwendengetattr
stattdessen.Da diese Frage, wie Methoden innerhalb einer Klasse mithilfe der Zuweisung von Methodennamen zu einer Variablen [Duplikat], die als Duplikat wie diese markiert ist , dynamisch aufruft , veröffentliche ich hier eine verwandte Antwort:
Das Szenario ist, dass eine Methode in einer Klasse eine andere Methode für dieselbe Klasse dynamisch aufrufen möchte. Ich habe dem ursprünglichen Beispiel einige Details hinzugefügt, die ein breiteres Szenario und Klarheit bieten:
quelle
Dies ist eine einfache Antwort, mit der Sie beispielsweise den Bildschirm löschen können. Im Folgenden finden Sie zwei Beispiele mit eval und exec, bei denen nach dem Bereinigen oben 0 gedruckt wird (wenn Sie Windows verwenden, wechseln Sie
clear
zucls
Linux- und Mac-Benutzern, lassen Sie diese unverändert ) oder führen Sie sie einfach aus.quelle