[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