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

Ana Maria Gomes
5 minutos de leitura

Conteúdos do tutorial

No desenvolvimento de software, frequentemente nos deparamos com a necessidade de criar funções flexíveis, capazes de lidar com um número variável de argumentos. Em Python, isso é possível utilizando os conceitos de *args e **kwargs. Neste tutorial, vamos explorar como criar e utilizar funções com número arbitrário de argumentos em Python.

O que são *args e **kwargs?

Em Python, *args e **kwargs são usados para permitir que uma função aceite um número variável de argumentos.

  • *args permite que você passe um número variável de argumentos posicionais para uma função.
  • **kwargs permite que você passe um número variável de argumentos nomeados (ou argumentos com palavra-chave) para uma função.

Exemplo Básico com *args

Vamos começar com um exemplo simples de uma função que soma um número arbitrário de valores:

def somar(*valores):
    return sum(valores)

resultado = somar(1, 2, 3, 4)
print(resultado)  # Saída: 10
Testar

Neste exemplo, a função somar pode receber qualquer quantidade de argumentos e somá-los. O operador * antes do parâmetro valores indica que todos os argumentos passados para a função serão acumulados em uma tupla.

Exemplo Básico com **kwargs

Agora, vejamos um exemplo de uma função que exibe argumentos passados com e sem palavra-chave:

def exibe_argumentos(*args, **kwargs):
    print(f'Argumentos passados sem palavra-chave: {args}')
    print(f'Argumentos passados com palavra-chave: {kwargs}')

exibe_argumentos(1, 2, 3, nome='Juliano', idade=30)
Testar

Neste exemplo, *args captura os argumentos posicionais em uma tupla, enquanto **kwargs captura os argumentos nomeados em um dicionário.

Utilizando *args e **kwargs Juntos

Você pode combinar *args e **kwargs em uma única função para aceitar tanto argumentos posicionais quanto nomeados:

def funcao_completa(a, b, *args, **kwargs):
    print(f'a: {a}')
    print(f'b: {b}')
    print(f'args: {args}')
    print(f'kwargs: {kwargs}')

funcao_completa(1, 2, 3, 4, 5, nome='Juliano', idade=30)
Testar

A saída será:

a: 1
b: 2
args: (3, 4, 5)
kwargs: {'nome': 'Juliano', 'idade': 30}

Desmembrando Argumentos na Chamada de Funções

Você também pode usar os operadores * e ** para desmembrar sequências ou dicionários na hora de chamar uma função:

valores = [1, 2, 3]
dic = {'nome': 'Juliano', 'idade': 30}

exibe_argumentos(*valores, **dic)
Testar

Neste caso, a lista valores e o dicionário dic são desmembrados em argumentos individuais.

Decoradores e Funções com Número Arbitrário de Argumentos

Os decoradores em Python frequentemente utilizam *args e **kwargs para garantir que possam decorar qualquer função, independentemente do número e tipo de argumentos que ela aceita.

def meu_decorador(func):
    def wrapper(*args, **kwargs):
        print("Executando algo antes da função")
        resultado = func(*args, **kwargs)
        print("Executando algo depois da função")
        return resultado
    return wrapper

@meu_decorador
def dizer_oi(nome):
    print(f'Olá, {nome}!')

dizer_oi('Juliano')
Testar

A saída será:

Executando algo antes da função
Olá, Juliano!
Executando algo depois da função

Conclusão

Funções com número arbitrário de argumentos em Python são extremamente úteis para criar funções flexíveis e reutilizáveis. Utilizando *args e **kwargs, você pode criar funções que aceitam qualquer quantidade de argumentos posicionais e nomeados, tornando seu código mais robusto e adaptável a diferentes situações.

Experimente utilizar *args e **kwargs em seus próprios projetos e veja como eles podem simplificar a manipulação de argumentos em suas funções!

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: