[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