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