Programação Funcional — Python #2

Funções de alta ordem e Decorators

Émerson Silva
LICA
3 min readJun 18, 2019

--

<< Post anterior

Introdução

Em Python, como outras linguagens multiparadigma (JavaScript, Ruby, etc), funções são também um tipo primitivo ( function), permitindo serem usadas como argumento ou retorno de outras funções, as quais podemos chamar de Funções de Alta Ordem ou HOFs (High Order Functions).

Generalização de funções

Outro bom exemplo de uso de HOFs é a generalização de funções. Usarei como exemplo o métodosplit :

Se você não está familiarizado com a palavra-chave lambda, ela é a forma como podemos declarar funções anônimas(funções simples que não possuem um nome) em Python.

Esse foi um exemplo com apenas uma sentença, mas imagine o poder de generalização que temos com a função split_by() , eu posso definir qualquer caractere que eu queira separar uma expressão e reusar essa lógica em qualquer parte do meu código ou em qualquer outra coleção de sentenças:

Acima o código está expressando que vai ocorrer o mapeamento( map) de cada sentença em sentencespara um novo tipo de dado através da função split_by_comma .

Python possui um módulo chamado operator que evita a escrita de funções lambdas simples: chamar um método, acessar uma propriedade de todos os objetos dentro de uma estrutura(lista, dicionário, tupla, etc).

Podemos usar o a função methodcaller(),do módulo operator, em que eu passo o nome de outra função que quero chamar e os próximos parâmetros serão passados para a mesma.

Decorators

Python possui uma representação para funções de alta ordem, conhecida como decorator( @ ), e são amplamente usados em frameworks, como Flask e Django. Com decorators “capturamos” uma função e aplicamos alguma operação ao retorno da mesma:

Acima transform_content recebe uma string e retorna ela com o case invertido( swapcase). Quando colocamos @split_by_comma na linha imediatamente acima da definição de transform_content , implicitamente, estamos capturando transform_content .

Na definição de split_by_comma() o parâmetro fn é a função que será capturada, definimos uma função (wrapper) com a mesma assinatura de fn, que irá ser chamada quando chamarmos fn , que nesse exemplo é transform_content. Quando chamamos transform_content('some, content') na verdade estamos fazendo: transform_content('some, content').split(',') .

O uso do decorator é equivalente à:

O uso de decorators só é viável quando precisamos aplicar uma mesma lógica em vários outros métodos ou funções, aumentando o reuso e a manutenibilidade.

Leituras adicionais

“Do or Do not. There is no try” — Yoda

--

--