Python⏱ ~2 min de leitura
Decorators
Funções que modificam funções
Decorators são funções que recebem uma função como argumento e retornam uma versão modificada dela. São aplicados com a sintaxe @decorator logo acima da definição da função.
Um decorator típico cria uma função interna (wrapper) que envolve a original, podendo executar código antes e depois, modificar argumentos ou retorno, ou adicionar funcionalidades como cache, logging e validação.
functools.wraps é essencial para preservar o nome e a docstring da função original dentro do wrapper. Múltiplos decorators podem ser aplicados à mesma função — são aplicados de baixo para cima.
Exemplo.java
import functools
import time
# Decorator básico
def meu_log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Chamando {func.__name__}")
resultado = func(*args, **kwargs)
print(f"Retornou: {resultado}")
return resultado
return wrapper
@meu_log
def somar(a, b):
return a + b
somar(2, 3)
# Chamando somar
# Retornou: 5
# Decorator de tempo de execução
def cronometrar(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
fim = time.time()
print(f"{func.__name__} levou {fim - inicio:.4f}s")
return resultado
return wrapper
# Decorator com parâmetros
def repetir(vezes):
def decorador(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(vezes):
func(*args, **kwargs)
return wrapper
return decorador
@repetir(3)
def dizer_oi():
print("Oi!")💡 Dica pro
Sempre use @functools.wraps(func) no wrapper para preservar __name__, __doc__ e __annotations__ da função original.
Recompensa+45 XP+exercícios