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

Was ist der beste Weg, um über den Aufruf einer Funktion gegeben eine Zeichenfolge mit der Funktion & #39; s Namen in einem Python-Programm zu gehen. Nehmen wir zum Beispiel an, ich habe ein Modul "foo" und eine Zeichenkette, deren Inhalt "bar" ist. Wie rufe ich am besten foo.bar() auf?

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

Lösung

Angenommenes Modul foo mit Methode bar:

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

Man könnte die Zeilen 2 und 3 kürzen zu:

result = getattr(foo, 'bar')()

kürzen, wenn das für Ihren Anwendungsfall sinnvoller ist.

Sie können getattr auf diese Weise für an Klasseninstanzen gebundene Methoden, Methoden auf Modulebene, Klassenmethoden... verwenden.

Kommentare (12)
locals()["myfunction"]()

oder

globals()["myfunction"]()

locals gibt ein Wörterbuch mit einer aktuellen lokalen Symboltabelle zurück. globals gibt ein Wörterbuch mit der globalen Symboltabelle zurück.

Kommentare (4)

Die Lösung von Patrick ist wahrscheinlich die sauberste. Wenn Sie das Modul auch dynamisch abholen müssen, können Sie es wie folgt importieren:

module = __import__('foo')
func = getattr(module, 'bar')
func()
Kommentare (6)