Entendendo *args e **kwargs em Funções Python

Ana Maria Gomes
6 minutos de leitura

Conteúdos do tutorial

Quando você está aprendendo Python, pode se deparar com definições de funções que incluem *args e **kwargs e se perguntar para que servem. Esses são símbolos especiais usados em definições de funções que permitem passar um número variável de argumentos para uma função. Vamos entender o que cada um desses nomes representa, e como você pode usar *args e **kwargs em Python para aumentar a eficácia e legibilidade do seu código.

Computador sendo usado para escrever código Python.

O que é *args em Python?

O *args é uma expressão comum em Python que permite passar um número arbitrário de argumentos para uma função. Esses argumentos são agrupados em uma tupla antes de serem passados para a função. Aqui está um exemplo simples para ilustrar *args:

def func(*args):
    for a in args:
        print(a)


func(1)
func(1, 2, 3)

No exemplo acima, definimos a função func(), que aceita qualquer argumentos passados a ela. chamar func(1) imprimirá 1, e chamar foo(1, 2, 3) imprimirá 1, 2 e 3 em linhas separadas. O *args coleta todos os argumentos posicionais em uma tupla representada pela variável args, o que facilita a iteração sobre eles.

O que é **kwargs em Python?

De maneira similar, **kwargs faz com que uma função aceite argumentos nomeados arbitrários, isto é, argumentos que você passa para a função com a estrutura nome="valor". O **kwargs coleta todos os argumentos de palavra-chave em um dicionário, onde a chave é o nome do parâmetro, e seu valor correspondente é o valor entregue à função. Veja o exemplo a seguir:

def func(**kwargs):
    for key, value in kwargs.items():
        print(f"{key} = {value}")


func(name='Juliano', age=27)

Neste caso, a função func() aceita qualquer argumento nomeado que for entregue a ela. Chamar func(name='Juliano', age=27) imprimirá name = Juliano e age = 27. Isso demonstra que a variável kwargs coleta todos os argumentos de palavra-chave em um dicionário, sobre o qual iteramos com o método .items().

Misturando *args, **kwargs e Parâmetros Regulares

Você pode misturar *args e **kwargs com parâmetros regulares de função para permitir uma combinação de argumentos fixos e variáveis:

def func(valorno-editor, *args, nome=None, **kwargs):<br>    print(valor, args, nome, kwargs)<br><br><br>func(123, 'a', 'b', nome='Juliano', cor='vermelho')

Esta chamada da função func() imprimirá o seguinte:

123 ('a', 'b') Juliano {'cor': 'vermelho'}

Vamos avaliar o que aconteceu: o primeiro argumento é atribuído ao parâmetro valor, enquanto o *args coleta os demais argumentos (os valores 'a' e 'b') como uma tupla. O parâmetro nome recebe o valor 'Juliano' de forma explícita, pois é um argumento nomeado. Por fim, como não há um parâmetro explícito chamado cor, o valor 'vermelho' é capturado pelo **kwargs em um dicionário.

Usando os Operadores de Asterisco * e ** ao Chamar Funções

Você também pode usar os operadores * e ** ao chamar funções. Eles servem para desempacotar sequências (no caso de *) ou dicionários (no caso de **) em argumentos separados:

def func(x, y, z):
    print(f"x={x}, y={y}, z={z}")


valores_lista = [1, 2, 3]
func(*valores_lista)

valores_dict = {'x': 1, 'y': 2, 'z': 3}
func(**valores_dict)

Ambas chamadas da função func() irão exibir o resultado x=1, y=2, z=3. Usar *valores_lista desempacota a lista em argumentos individuais, portanto a chamada de função é equivalente a func(1, 2, 3). De forma similar, **valores_dict desempacota o dicionário em argumentos de palavra-chave, sendo equivalente a chamar a função como func(x=1, y=2, z=3).

Resumo: *args e **kwargs em Python

Neste post, exploramos o uso de *args e **kwargs em funções Python. *args permite passar um número variável de argumentos posicionais, enquanto **kwargs permite um número arbitrário de argumentos de palavra-chave. Estes podem ser misturados com parâmetros regulares para criar definições de funções flexíveis. Além disso, você pode usar * e ** para desempacotar listas, tuplas ou dicionários ao chamar funções, tornando seu código mais conciso e legível.

Entender esses conceitos aumentará significativamente sua capacidade de escrever e trabalhar com funções em Python!

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: