[Python] invocare funzione dal nome

y3s a katamail.com y3s a katamail.com
Lun 28 Apr 2008 13:37:42 CEST


> Ciao,
>
> Mr.SpOOn spiffera, lunedì 28 aprile 2008 circa:
>> Una soluzione penso possa essere un costrutto if-else, finché non
>> trovo la funzione desiderata.
>> Mi chiedevo però se ci fosse un metodo più elegante che mi permettesse
>> di leggere il nome della funzione direttamente dal menu a tendina, o
>> anche da un file yaml, ad esempio, e rendere così l'invocazione
>> dinamica.
>
> Il modo piu' scemo che mi viene in mente, e' quello di creare un dict()
> con
> le tue funzioni.
>
> funct_dict = {'pippo':a, 'ciccio':b, 'puzzetta':c }
>
> e dopo le richiami normalmente, con
>
> result = funct_dict['puzzetta']()
>

Questo e' sicuramente uno dei modi migliori, in quanto hai un certo grado
di controllo su quello che puo' essere chiamato. Piu' genericamente, per
accedere dinamicamente a un attributo di un oggetto:

getattr(oggetto, "nome")

quindi:

getattr(oggetto, "nome_metodo")(...parametri...)

Se si tratta di una funzione locale:

locals()["nome_funzione"](...parametri...)

...e cosi' via (funzioni globali, builtin, ecc)

Con il dizionario hai in genere piu' controllo, ed e' preferibile.

-- 
Antonio Valente



Maggiori informazioni sulla lista Python