[Python] Funzioni come moduli

Daniele Varrazzo piro a develer.com
Lun 30 Giu 2008 15:56:54 CEST


<11f816ab0806291343p6222fcedy736975df8205b7db a mail.gmail.com> <1214833299.8816.4.camel a learts-desktop>
Message-ID: <3131499a67bc0a6c60e530ac1d8fe7ac a develer.com>
X-Sender: piro a develer.com
Received: from 82.111.147.97 [82.111.147.97] with HTTP/1.1 (POST); Mon, 30 Jun
	2008 15:56:54 +0200
User-Agent: RoundCube Webmail/0.1
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit



On Mon, 30 Jun 2008 15:41:39 +0200, Leonardo <learts92 a gmail.com> wrote:
> Alla fine ho risolto con execfile, è incredibile: esegue un file come se
> fosse all'interno del file chiamante, passandogli tutte le variabile, le
> funzioni, e le classi esistenti.

Good

> L'unica cosa è che adesso un modulo è così ad esempio:
> 
> file rejoin.py:
> 
> #! /usr/bin/python
> # -*- coding: UTF-8 -*-
> user, mode, chan, request = self.get_params(server_response)
> if self.Bot.nick in server_response:
> 	print "Sono stato kikkato!"
> 	self.Bot.join(chan)
> 	self.send(self.response, chan)
> 
> E fa un po' senso vederlo così, con praticamente tutte le variabili e
> funzioni non dichiarate nè passate come argomento eppure funzionanti.
> Ovvio che se lo lancio direttamente solleva decine di errori xD

Magari ci sono un po' troppe cose implicite :)

forse sarebbe un design migliore cambiare la signature delle funzioni
passandogli esplicitamente dei parametri in piu': sarebbe piu' facile da
testare e migliore dal punto di vista del "principio del minimo stupore".

Mi sembra di capire che tu fai execfile per sfruttare gli effetti secondari
delle istruzioni eseguite. Se posso, ti suggerisco di creare dei moduli
plugin che definiscano unicamente una funzione. Puoi "caricare" tutti i
plugin all'avvio del programma o ad un certo evento e poi usare le funzioni
dove servono.

Puoi definire ad esempio che ogni plugin debba esportare una funzione
handle_<qualcosa> con una signature prefissata - diciamo (self,
server_response). All'atto di caricare i plugin puoi fare (untested, e
senza error handling):

    env = {}
    execfile(my_file, env)
    
    for k, v in env.iteritems():
        if k.startswith('handle_'):
            register_plugin(v)
            break
    else:
        complain("no plugin in this file")

Se i plugin hanno la possibilita' di poter intervenire in diverse fasi del
tuo processo, potresti definire una classe BasePlugin fornita dei diversi
hook e implementare gli hook desiderati in ogni plugin.

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



Maggiori informazioni sulla lista Python