[Python] decoratori ..
Marco Giusti
marco.giusti a gmail.com
Mar 29 Nov 2011 22:19:42 CET
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.
Maggiori informazioni sulla lista
Python