Por alguns meses fiquei pensando – para que servem os decorators em python? Ultimamente é fácil ver código do tipo:
@algum_metodo
def function(params):
...
AÃ hoje finalmente decidi descobrir como que isso funciona, e para que serve.
Em poucas palavras – realmente, decoratos são bem úteis. Eles não introduzem muitas novidades na linguagem, mas possibilitam evitar duplicação de código, e facilitar a implementação.
Por exemplo, suponhamos que precisamos rastrear todas as chamadas a uma de terminada função. Quais são as alternativas que temos?
- Mudar a função para ela fazer um print toda vez que ela é executada, e toda vez que ela termina;
- Fazer um wrapper para essa função;
- Usar um decorator.
Vamos pensar em uma função bem simples:
def minhafunc(s):
print "<<; %s >> " % s
Como que poderiamos fazer o wrapper para esta função esta função? Por exemplo:
def wrapper(func):
print "entrando na func!"
ret = func()
print "saindo da func!"
return ret</code>
result = wrapper(minhafunc())
Obviamente, isso funciona.. Mas para funções bem simples.
Um outro jeito seria transformar função automaticamente:
def logger(func):
def wrapper(param):
print "entrando na func!"
ret = func(param)
print "saindo da func!"
return ret
return wrapper
minhafunc = logger(minhafunc)
E agora vem a parte “mágica”. Decorators simplesmente permitem com que você evite a transformação de python em LISP, tirando a necessidade de empacotamento explÃcito dessas funções. Em outras palavras:
@logger
def minhafunc():
...
faz a mesma coisa que:
minhafunc = logger(minhafunc)
só que logo após a declaração da função.
Só isso
. É claro, que tem várias outras utilidades os decorators – facilitar o uso de threads em PyGTK; facilitar desenvolvimento de código sincronizado, etc.
Sem falar que fica bem mais legÃvel o código:
@synchronized
@logged
def minhafunc():
...
P.S.: O wordpress, para variar, deixa zoado o código.. Mas logo-logo este site vai migrar para Django. Desde que aprendi a mexer com ele, a minha opinião sobre os frameworks web mudou.. e muito!











