Python/Funções/Decorators
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