Funções Decoradoras

As funções decoradoras em Python são uma característica poderosa e flexível da linguagem. Elas permitem modificar ou aprimorar o comportamento de funções ou métodos de forma elegante e reutilizável. As funções decoradoras são amplamente usadas em Python para realizar tarefas como registro de log, medição de tempo, controle de acesso, entre outras. Neste tutorial, vamos explorar o mundo das funções decoradoras em Python, entender sua sintaxe e aprender como usá-las para aprimorar suas funções de forma elegante.

1. Introdução às Funções Decoradoras:

Em Python, as funções são cidadãos de primeira classe, o que significa que podem ser tratadas como qualquer outra variável. Isso permite que você passe funções como argumentos para outras funções, retorne funções de outras funções e, crucialmente, defina funções dentro de funções. Essa característica é a base das funções decoradoras.

2. Sintaxe Básica de Funções Decoradoras:

Uma função decoradora é uma função que aceita outra função como argumento e retorna uma nova função com o comportamento aprimorado. A sintaxe básica de uma função decoradora é a seguinte:

def decorador(funcao):
    def wrapper(*args, **kwargs):
        # Código a ser executado antes da função original
        resultado = funcao(*args, **kwargs)
        # Código a ser executado após a função original
        return resultado
    return wrapper

@decorador
def funcao_original():
    # Corpo da função original
    pass

A notação @decorador é uma forma de aplicar a função decoradora à função original funcao_original.

3. Exemplo de Função Decoradora:

Exemplo: Medição de Tempo de Execução:

import time

def medir_tempo(funcao):
    def wrapper(*args, **kwargs):
        inicio = time.time()
        resultado = funcao(*args, **kwargs)
        fim = time.time()
        print(f"A função '{funcao.__name__}' levou {fim - inicio:.2f} segundos para executar.")
        return resultado
    return wrapper

@medir_tempo
def funcao_lenta():
    time.sleep(2)
    print("Função lenta executada.")

funcao_lenta()

Neste exemplo, a função decoradora medir_tempo mede o tempo de execução da função funcao_lenta. A função decoradora aceita uma função como argumento, executa-a e imprime o tempo de execução.

4. Usos Comuns de Funções Decoradoras:

  • Registro de Log: Registra informações sobre a execução de funções.
  • Autenticação e Autorização: Controla o acesso a funções com base nas credenciais do usuário.
  • Cache de Resultados: Armazena em cache os resultados de funções para entradas específicas para melhorar a eficiência.
  • Validação de Parâmetros: Verifica os parâmetros de entrada das funções.
  • Tratamento de Erros: Manipula exceções de maneira centralizada.

As funções decoradoras são uma ferramenta poderosa em Python que permite adicionar funcionalidades a funções existentes de forma elegante e modular. Elas são amplamente usadas em várias bibliotecas e frameworks Python para melhorar o comportamento das funções de maneira flexível e reutilizável.