Decoradores em Python: Um Guia Completo

Ana Maria Gomes
6 minutos de leitura

Conteúdos do tutorial

Os decoradores em Python são uma ferramenta poderosa que permite modificar ou estender o comportamento de funções ou métodos sem alterar seu código fonte original. Neste tutorial, vamos explorar o que são decoradores, como funcionam e como você pode utilizá-los em seus projetos Python.

O que são Decoradores em Python?

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.

Funções são Objetos em Python

Para entender decoradores, primeiro precisamos lembrar que funções em Python são objetos. Isso significa que elas podem ser assinaladas para alguma variável, passadas como argumento de outra função e até mesmo retornadas por outras funções.

def func():
    return 2

minha_funcao = func
retorno = minha_funcao()

print(retorno)
# output: 2

Passando Funções como Argumentos

Podemos passar funções como argumentos para outras funções, o que é a base para criar decoradores.

def hello():
    return 'Oi, José!'

def outra_funcao(func):
    print('Outro código aqui')
    print(func())

outra_funcao(hello)
# output:
# Outro código aqui
# Oi, José!
Testar

Criando Decoradores

Vamos construir um decorador simples que modifica o comportamento de uma função para que ela retorne seu resultado em 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!
Testar

Explicando o Código

  1. Definindo o Decorador: Criamos uma função meu_decorador que aceita uma função func como argumento.
  2. Função Interna: Dentro de meu_decorador, definimos uma nova função meu_pacote que aceita qualquer número de argumentos (*args) e argumentos nomeados (**kwargs).
  3. Chamando a Função Original: meu_pacote chama a função original func com os argumentos recebidos e transforma o resultado em letras maiúsculas.
  4. Decorando a Função: Usamos a sintaxe @meu_decorador para aplicar o decorador à função dizer_oi.

Decoradores com Argumentos

Às vezes, queremos que nossos decoradores aceitem argumentos. Para isso, precisamos de um nível extra de funções.

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!
Testar

Explicando o Código

  1. Função Externa: repetir_vezes aceita um argumento n e retorna o decorador.
  2. Decorador: O decorador decorador aceita a função func e retorna o wrapper.
  3. Wrapper: O wrapper executa a função n vezes.

Decoradores na Vida Real

Na prática, muitos frameworks e bibliotecas Python utilizam decoradores. Por exemplo, a biblioteca Dash usa decoradores para definir callbacks em dashboards.

from dash import Dash, html, dcc
from dash.dependencies import Input, Output

app = Dash(__name__)

app.layout = html.Div([
    dcc.Input(id='input', value='Digite algo', type='text'),
    html.Div(id='output')
])

@app.callback(
    Output(component_id='output', component_property='children'),
    [Input(component_id='input', component_property='value')]
)
def update_output_div(input_value):
    return f'Você digitou: {input_value}'

if __name__ == '__main__':
    app.run_server(debug=True)

Explicando o Código

  1. Definindo o Layout: Criamos um layout simples com um Input e um Div.
  2. Callback Decorator: Usamos o decorador @app.callback para definir que a função update_output_div será chamada sempre que o valor do Input mudar.

Conclusão

Os decoradores em Python são uma ferramenta poderosa para modificar e estender o comportamento de funções de maneira limpa e eficiente. Eles são amplamente utilizados em bibliotecas e frameworks, tornando o código mais legível e modular. Experimente criar seus próprios decoradores e veja como eles podem simplificar seu código!

Se você gostou deste tutorial sobre decoradores em Python, compartilhe com seus colegas e continue explorando as possibilidades que essa linguagem incrível oferece!

Inscreva-se gratuitamente e fique atualizado

Receba toda semana um resumo dos principais conteúdos da Asimov direto no seu e-mail. 100% livre de spam.

Áreas de interesse: