Explorando o Módulo functools em Python

Os decoradores em Python são uma ferramenta poderosa que permite modificar o comportamento de funções ou métodos sem alterar seu código-fonte. Eles são amplamente utilizados para adicionar funcionalidades de forma elegante e eficiente. Neste tutorial, vamos explorar como os decoradores funcionam e demonstrar com exemplos práticos.
Em poucas palavras, decoradores modificam a forma com que uma função opera, porém sem mudar a lógica da função em si. Eles ajudam a tornar seu código mais curto e mais “Pythonico”. Podemos pensar em decoradores como algo que “adiciona utilidade extra” a alguma função já existente.
Para entender decoradores, é essencial saber que funções em Python são objetos. Isso significa que elas podem ser assinaladas para alguma variável e passadas como argumento de outra função.
def func():
return 2
minha_funcao = func
retorno = minha_funcao()
print(retorno)
# output: 2
TestarPodemos passar funções como argumentos para outras funções, o que é a base para criar decoradores.
def exibe_func(f):
print(f'Objeto de função recebido: {f}')
print(f'Nome da função: "{f.__name__}"')
exibe_func(func)
Vamos criar um decorador simples que converte o retorno de uma função para letras maiúsculas.
def meu_decorador(func):
def meu_pacote(*args, **kwargs):
retorno = func(*args, **kwargs)
return retorno.upper()
return meu_pacote
@meu_decorador
def dizer_oi(nome):
return f'Olá, {nome}!'
print(dizer_oi('Juliano'))
# output: OLÁ, JULIANO!
Testarmeu_decorador
que aceita uma função func
como argumento.meu_decorador
, definimos meu_pacote
, que chama func
e converte seu retorno para maiúsculas.meu_decorador
retorna meu_pacote
, que é a função decorada.@meu_decorador
acima da definição da função dizer_oi
, aplicando o decorador.Podemos criar decoradores que aceitam argumentos. Vamos criar um decorador que repete a execução de uma função um número específico de vezes.
def repetir_vezes(n):
def decorador(func):
def wrapper(*args, **kwargs):
for _ in range(n):
resultado = func(*args, **kwargs)
return resultado
return wrapper
return decorador
@repetir_vezes(3)
def dizer_oi(nome):
print(f'Olá, {nome}!')
dizer_oi('Juliano')
# output:
# Olá, Juliano!
# Olá, Juliano!
# Olá, Juliano!
Testarrepetir_vezes
aceita um argumento n
e retorna o decorador decorador
.decorador
define wrapper
, que executa func
n
vezes.@repetir_vezes(3)
para aplicar o decorador à função dizer_oi
.Podemos aplicar múltiplos decoradores a uma função. Vamos criar dois decoradores e aplicá-los a uma função.
def maiusculas(func):
def wrapper(*args, **kwargs):
retorno = func(*args, **kwargs)
return retorno.upper()
return wrapper
def repetir(func):
def wrapper(*args, **kwargs):
resultado = func(*args, **kwargs)
return resultado * 2
return wrapper
@repetir
@maiusculas
def saudacao(nome):
return f'Olá, {nome}!'
print(saudacao('Juliano'))
# output: OLÁ, JULIANO!OLÁ, JULIANO!
Testarmaiusculas
converte o retorno para maiúsculas e repetir
duplica o retorno.@repetir
e @maiusculas
para aplicar ambos os decoradores à função saudacao
.Os decoradores em Python são uma ferramenta poderosa para modificar o comportamento de funções de forma elegante e eficiente. Eles permitem adicionar funcionalidades sem alterar o código-fonte das funções originais. Compreender e utilizar decoradores pode tornar seu código mais modular e reutilizável.
Experimente criar seus próprios decoradores e explore as possibilidades que eles oferecem para tornar seu código mais Pythonico e eficiente!
Aprenda a programar e desenvolva soluções para o seu trabalho com Python para alcançar novas oportunidades profissionais. Aqui na Asimov você encontra:
Comentários
30xp