[Python] trasformare una stringa in un nome di funzione.

Flaper87 flaper87 a gmail.com
Mar 25 Giu 2013 16:48:13 CEST


2013/6/25 Giovanni Porcari <giovanni.porcari a softwell.it>

>
> Il giorno 25/giu/2013, alle ore 16:08, Gollum1 <gollum1.smeagol1 a gmail.com>
> ha scritto:
>
> > Ho trovato in alcuni articoli (il principale è stato un articolo su
> > stackoverflow, sul case che in python non esiste) e nel testo del
> > nostro Marco Beri la possibilità di utilizzare una funzione come
> > argomenti di un'altra funzione...
> >
> > il mio intento sarebbe quello di richiamare delle funzioni in base ad
> > un parametro passato dalla linea di comando, e processato da
> > argparse()
> >
> > quindi ho preparato questa def:
> >
> > def exec_function(function, *args, **kargs):
> >    function(args, kargs)
> >
> > nel main richiamo la funzione passando come primo argomento l'output
> > di argparse relativo proprio a quello che mi serve...
> >
> > il problema è che function risulta essere una stringa, e giustamente
> > non può essere usata come funzione... come posso passare dal nome
> > della funzione contenuta in una stringa, alla funzione vera e propria?
> >
> > Naturalmente ora tutto funziona con una serie di if...elif...else,
> > quindi è una domanda più accademica che altro.
> >
> > Grazie...
> >
>
>
> usare getattr(self, nome) ?
>


In base all'uso finale di ciò che stai facendo, ci sono diversi metodi per
"caricare" una funzione partendo dal suo nome:

1) Se tutte le funzioni sono dentro lo stesso modulo e si tratta di uno
"script" potresti usare globals() e prenderti la funzione da lì.

2) Un'altro metodo sarebbe avere il "path" d'importazione
("miomodulo.miafunzione") della funzione ed importarla in exec_function.
(Questa non la consiglio ameno che tu non sappia esattamente cosa stai
facendo. Ci sono metodi migliori per gestire import dinamici)

3) Se si tratta invece di un metodo ed è definito nella classe che
definisce exec_function (cosa che non sembra, vista la signature di
exec_function) allora potersti usare getattr.

4) Usa entry_points e carica le funzioni che appartengono al tuo namespace
dinamicamente. Stevedore[0] è una libreria che ti permette fare questo
facilmente ed ha supporto per diversi pattern.

Personalmente, preferisco #4 ameno che non stia facendo un semplice script.

FF

[0] http://stevedore.readthedocs.org/en/latest/

-- 
-- 
Flavio (@flaper87) Percoco
http://www.flaper87.org
http://github.com/FlaPer87
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20130625/b057e5ab/attachment-0001.html>


Maggiori informazioni sulla lista Python