[Python] Funzioni come moduli
Daniele Varrazzo
piro a develer.com
Dom 29 Giu 2008 19:24:39 CEST
Domenico Chierico ha scritto:
> On Sun, 2008-06-29 at 15:54 +0200, Leonardo wrote:
>
>> Quindi mi sarebbe d'aiuto un buon metodo per importare moduli a seconda
>> di una variabile, o altri modo per definire ed utilizzare funzioni in
>> files esterni al "cuore" del programma.
>> Grazie per le eventuali risposte :)
>
> credo che quello che tu stai cercando e' proprio la funzione __import__
> che ti permette di importare un modulo dal suo nome.
>
> Io personalmente risolvo questo tipo di problema usando una directory
> come modulo dei plugin, quindi all'avvio dell'applicazione cerco i file
> all'interno di quella directory e da questi vi importo le classi (senza
> istanziarle e creo un indice degli oggetti, per associare a questi delle
> regole di attivazione (come nel tuo caso) uso un metodo di classe che mi
> ritorna la chiave di selezione per quello specifico oggetto.
>
> eccoti un breve esempio:
>
> tmp = [ i for i in os.listdir("Actions") if i.endswith(".py")]
> self.handlers = {}
> for i in tmp:
> cname = i[0:-3]
> module = __import__("Actions."+cname, globals(),locals(),["*"])
> mtclass = getattr(module,cname)
> self.handlers[mtclass.getRule()]= mtclass
Ancora più facile è usare execfile() per eseguire un file python in un
dizionario dal quale poi pescare gli oggetti che servono.
Come vantaggio i tuoi plugin non devono risiedere nel pythonpath, il risultato
della funzione non è il package di base (Actions nel tuo caso, per cui dopo è
necessario fare "getattr(module,cname)". In generale le operazioni fatte con
execfile mi sembrano più pulite (__import__ è l'hook che implementa lo
statement import: presa in maniera isolata da questo contesto, la sua
semantica è quantomeno bizzarra).
Documentazione:
- __import__(): http://docs.python.org/lib/built-in-funcs.html#l2h-6
- execfile(): http://docs.python.org/lib/built-in-funcs.html#l2h-26
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
Maggiori informazioni sulla lista
Python