On Tue, Nov 29, 2011 at 09:45:33PM +0100, Matteo Boscolo wrote:
> ciao a tutti
> stavo giocando con i decoratori
> con il seguente codice:
> a=10
> b=20
> 
> def ex(fooo):
>     return fooo()
> 
> @ex
> def g():
>     return f+b

quando il modulo viene caricato viene anche eseguito e quando incontra
la linea:

        @ex

esegue il decoratore, `fooo`, con la funzione `g` come argomento.

questo è quello che succede, ma forse lo avevi capito, quello che è poco
chiaro è la logica di questo poco codice. prima di tutto fai la somma
tra una funzione e un intero che ha poco senso. inoltre ancora
l'interprete non ha raggiunto la definizione della funzione `f` ed è per
questo che hai un errore. e ancora i decoratori devono tornare una
funzione, o un metodo, altrimenti decorano poco.

un esempio un po' più pratico di un decoratore che logga i parametri e
il valore di ritorno di una funzione.


        def logger(func):
                def wrapper(*args, **kwds):
                                                                        # 
sostituita con questa
                        print(''args)


        >>> def log(func): # accetta una funzione come parametro
        ...  def wrapper(*a, **kw): # funzione sostitutrice
        ...   print(a)
        ...   print(kw)
        ...   ret = func(*a, **kw) # chiama la funzione originale
        ...   print(ret)
        ...   return ret
        ...  return wrapper # ritorna la funzione decorata
        ... 
        >>> def sum(a, b):
        ...  return a+b
        ... 
        >>> logged_sum = log(sum)
        >>> logged_sum(1, 2)
        (1, 2)
        {}
        3
        3
        >>> 

spero ti sia più chiaro l'uso dei deocratori. fai attenzione che i
decoratori hanno anche una sintassi alternativa.

m.

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a