[Python] python plugin pattern

Daniele Varrazzo piro a develer.com
Mar 6 Mar 2007 20:46:49 CET


Iacopo Masi ha scritto:
> Salve,
> scrivo per sapere se esiste una guida o un libro che indichi come poter 
> sviluppare un' applicazione grafica python estendibile attraverso l'uso 
> di plugin o (appunto) estensioni.
> Non  sono alla ricerca di codice puro in quando per ora non ho 
> controllato per bene se esiste già qualcosa di spiegato, ma magari 
> speravo che qualcuno di voi laggiù potesse consigliarmi qualche design 
> pattern. (ne ho applicati qualcuno in C++, combinandoli appena insieme 
> ex. singleton, state...).
> Per ora sui pattern in python ho trovato solo questo [1] documento.
> Qualcuno saprebbe consigliarmi qualche idioms/pattern per implementare 
> estendibiità in python?

Implementare un meccanismo di estensioni in Python è estremamente facile. Un 
possibile modo è quello di stabilire che tutte le estensioni saranno moduli 
(file .py) salvati in una certa directory, per esempio "plugins".

A runtime, da Python è molto facile verificare cosa ci sia in quella directory 
ed andare alla ricerca di qualcosa per cui hai stabilito una convenzione, per 
esempio una funzione entry point dal nome prestabilito oppure una classe che 
sia sottoclasse di una classe "Plugin" che l'applicazione ha messo a 
disposizione di base.

Il meccanismo chiave da usare, al di là della convenzione che deciderai, è la 
valutazione dinamica del codice: usando la funzione "execfile(nomefile, 
namespace)" [1] il file "nomefile" verrà eseguito e gli oggetti creati (anche 
le definizioni di classi e funzioni) verranno depositati nel dizionario 
"namespace", dal quale puoi comodamente evedere se esiste una funzione con un 
dato nome o una sottoclasse di una data classe.

Ho utilizzato una cosa del genere (con le classi) in un programmino che ho 
scritto all'università, scaricabile da http://sadic.sourceforge.net. Puoi dare 
un'occhiata ai sorgenti, anche da svn: i plugin sono caricati dalla funzione 
sadic.viewer.load_plugin(); i plugin disponibili sono nella directory 
sadic/plugin.

Per altre info su pattern implementati in Python, c'è il Thinking in Python 
[2] che forse potrebbe contenere info interessanti (se non altro per vedere la 
differenza implementativa che potrebbe esserci tra Python e ad es. C++, che in 
certi casi, come per il pattern "Visitor", potrebbe essere enorme)

Spero aiuti. Ciao!

[1] http://docs.python.org/lib/built-in-funcs.html
[2] http://www.mindview.net/Books/TIPython

-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python