Chiamare una funzione di un modulo usando il suo nome (una stringa)

Qual è il modo migliore per chiamare una funzione data una stringa con il nome della funzione in un programma Python. Per esempio, diciamo che ho un modulo foo, e ho una stringa il cui contenuto è "bar". Qual è il modo migliore per chiamare foo.bar()?

Ho bisogno di ottenere il valore di ritorno della funzione, che è il motivo per cui non uso semplicemente eval. Ho capito come farlo usando eval per definire una funzione temporanea che restituisce il risultato di quella chiamata di funzione, ma spero che ci sia un modo più elegante per farlo.

Soluzione

Assumendo il modulo foo con il metodo bar:

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

Potresti accorciare le linee 2 e 3 in:

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

se questo ha più senso per il tuo caso d'uso.

Potete usare getattr in questo modo su metodi legati a istanze di classe, metodi a livello di modulo, metodi di classe... la lista continua.

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

o

globals()["myfunction"]()

locals restituisce un dizionario con la tabella dei simboli locali corrente. globals restituisce un dizionario con la tabella globale dei simboli.

Commentari (4)

La soluzione di Patrick è probabilmente la più pulita. Se avete bisogno di prelevare dinamicamente anche il modulo, potete importarlo come:

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