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! :)

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2012 Eugeni's blog Suffusion theme by Sayontan Sinha