Funções com Número Arbitrário de Argumentos em Python

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.
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, 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
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é!
TestarVamos 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!
Testarmeu_decorador
que aceita uma função func
como argumento.meu_decorador
, definimos uma nova função meu_pacote
que aceita qualquer número de argumentos (*args
) e argumentos nomeados (**kwargs
).meu_pacote
chama a função original func
com os argumentos recebidos e transforma o resultado em letras maiúsculas.@meu_decorador
para aplicar o decorador à função dizer_oi
.À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!
Testarrepetir_vezes
aceita um argumento n
e retorna o decorador.decorador
aceita a função func
e retorna o wrapper
.wrapper
executa a função n
vezes.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)
Input
e um Div
.@app.callback
para definir que a função update_output_div
será chamada sempre que o valor do Input
mudar.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!
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