[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