Olá pessoal, tudo bem?

A uns 2 meses comecei a estudar Machine Learning e, por consequência, também estou aprendendo Python.

Apesar de ainda preferir linguagens fortemente tipadas, gostei bastante de Python. Estou achando muito fácil de aprender, com uma sintaxe bastante legível e simples. Outros pontos que achei interessantes são a possibilidade de estender a linguagem utilizando bindings de C e C++ (que são linguagens que gosto bastante), e a quantidade de bibliotecas e artefatos existentes para ML.

Decorators

Diante disto, nesta semana resolvi parar para entender um pouco sobre o funcionamento dos decorators no Python (não confunda com o Decorator Pattern do GoF).

Decorator

Por vir do mundo .NET, inicialmente achei que os decorators operassem de forma similar aos meta-atributos em C#, mas estava ligeiramente enganado. Na realidade, o efeito dos decorators no Python pode ser reescrito da forma abaixo.

Decorators

No exemplo, tenho definida uma função decorator que recebe por parâmetro a função a ser estendida, no caso a função hello . Como retorno, estou devolvendo a função wrapper que adapta a função original.

Isto possibilita que qualquer função ou método que tenha a capacidade de receber uma outra função por parâmetro possa ser um decorator em potencial. Já o  @decorator é apenas um açúcar sintático para tornar a utilização deste recurso mais simples, e realmente faz a diferença. Veja abaixo:

Decorators

Como resultado, eu consigo executar a função hello na forma estendida, sem precisar aplicar a função decorator  explicitamente.

post

Decorator parametrizado

Precisa passar parâmetros para o decorator? Não tem problema. Basta encapsular a função decorator vista anteriormente, dentro de uma nova função message_decorator , que receberá o parâmetro e retornará a função encapsulada.

post

E o resultado será:

Resultado - Decorator parametrizado

 

Era isso pessoal, sou novato no Python e se alguém quiser dar alguma dica ou discutir alguma coisa, deixe mensagem ou comentário!

Um grande abraço a todos e boa semana!