Pular para o conteúdo

Como Usar o args de forma Fácil?

[

Python args e kwargs: Desmistificados

por Davide Mastromatteo intermediário python

No final do artigo, você entenderá:

  • O que *args e **kwargs realmente significam
  • Como usar *args e **kwargs em definições de função
  • Como usar um único asterisco (*) para desempacotar iteráveis
  • Como usar dois asteriscos (**) para desempacotar dicionários

Bônus grátis: Clique aqui para obter uma Folha de Cheats do Python e aprender os conceitos básicos do Python 3, como trabalhar com tipos de dados, dicionários, listas e funções em Python.

Faça o Quiz: Teste seus conhecimentos com nosso quiz interativo “Python args e kwargs: Desmistificados”. Ao final, você receberá uma pontuação para acompanhar seu progresso de aprendizado ao longo do tempo:

Faça o Quiz »

Passando Múltiplos Argumentos para uma Função

*args e **kwargs permitem que você passe múltiplos argumentos ou argumentos de palavras-chave para uma função. Considere o exemplo a seguir. Esta é uma função simples que recebe dois argumentos e retorna a soma deles:

Python

def minha_soma(a, b):
return a + b

Essa função funciona bem, mas está limitada a apenas dois argumentos. E se você precisar somar um número variável de argumentos, em que o número específico de argumentos passados só é determinado em tempo de execução? Não seria ótimo criar uma função que pudesse somar todos os inteiros passados para ela, não importa quantos sejam?

Usando a Variável args do Python em Definições de Função

Python somar_inteiros_lista.py

def minha_soma(meus_inteiros):
resultado = 0
for x in meus_inteiros:
resultado += x
return resultado
lista_de_inteiros = [1, 2, 3]
print(minha_soma(lista_de_inteiros))

Esta implementação funciona, mas sempre que você chamar essa função, também precisará criar uma lista de argumentos para passar a ela. Isso pode ser inconveniente, especialmente se você não souber de antemão todos os valores que devem ser inseridos na lista.

Aqui é onde *args pode ser realmente útil, porque permite que você passe um número variável de argumentos posicionais. Veja o exemplo a seguir:

Python somar_inteiros_args.py

def minha_soma(*args):
resultado = 0
# Iterando sobre a tupla args do Python
for x in args:
resultado += x
return resultado
print(minha_soma(1, 2, 3))

Neste exemplo, você não está mais passando uma lista para minha_soma(). Em vez disso, você está passando cada um dos argumentos separadamente. O operador * antes de args indica que a função pode receber um número variável de argumentos posicionais e eles serão agrupados em uma tupla.

Agora, você pode chamar minha_soma() com qualquer número de argumentos e eles serão somados corretamente.

Utilizando a Variável kwargs do Python em Definições de Funções

Até agora, você aprendeu como passar um número variável de argumentos posicionais para uma função usando *args. Mas e se você precisar passar um número variável de argumentos de palavras-chave, onde cada argumento é uma chave-valor? É aí que entra a variável **kwargs.

Assim como *args, **kwargs permite que você passe um número variável de argumentos de palavras-chave para uma função. A diferença é que **kwargs agrupa os argumentos adicionais em um dicionário, em vez de uma tupla.

Veja o exemplo a seguir:

Python saudacao.py

def saudacao(**kwargs):
for chave, valor in kwargs.items():
print(f"{chave} - {valor}")
saudacao(nome="Alice", idade=25, linguagem="Python")

Neste exemplo, você não está mais passando uma lista ou um tupla de argumentos de palavras-chave. Em vez disso, você está passando cada argumento separadamente usando o formato chave=valor. O operador ** antes de kwargs indica que a função pode receber um número variável de argumentos de palavras-chave e eles serão agrupados em um dicionário. Dentro da função, você pode iterar sobre os itens do dicionário para obter as chaves e valores.

Agora, quando você chama saudacao(), você pode passar quantos argumentos de palavras-chave quiser e eles serão impressos corretamente.

Ordenando Argumentos em uma Função

Quando se trabalha com uma função que recebe tanto *args quanto **kwargs, a ordem dos argumentos é importante. Os argumentos posicionais devem vir antes dos argumentos de palavras-chave. Por exemplo:

Python exemplo_ordem_args_kwargs.py

def minha_funcao(*args, **kwargs):
for arg in args:
print(arg)
for chave, valor in kwargs.items():
print(f"{chave} - {valor}")
minha_funcao(1, 2, nome="Alice", idade=25)

Neste exemplo, minha_funcao() aceita tanto argumentos posicionais quanto argumentos de palavras-chave. Os argumentos posicionais são impressos primeiro, seguidos pelos argumentos de palavras-chave.

Certifique-se de definir essa ordem corretamente ao definir suas próprias funções.

Desempacotamento com os Operadores Asterisco: * & **

Além de permitir passar um número variável de argumentos para uma função, *args e **kwargs também podem ser usados para desempacotar sequências e dicionários existentes.

Quando você usa um único asterisco (*) antes de uma sequência em uma chamada de função, os itens da sequência são desempacotados e passados como argumentos posicionais para a função. Veja o exemplo a seguir:

Python desempacotamento_lista.py

def minha_funcao(a, b, c):
print(f"a={a}, b={b}, c={c}")
lista = [1, 2, 3]
minha_funcao(*lista)

Neste exemplo, a lista [1, 2, 3] é desempacotada e os valores 1, 2 e 3 são passados como argumentos posicionais para minha_funcao().

Da mesma forma, quando você usa dois asteriscos (**) antes de um dicionário em uma chamada de função, os pares chave-valor do dicionário são desempacotados e passados como argumentos de palavras-chave para a função. Veja o exemplo a seguir:

Python desempacotamento_dicionario.py

def minha_funcao(nome, idade):
print(f"nome={nome}, idade={idade}")
dicionario = {"nome": "Alice", "idade": 25}
minha_funcao(**dicionario)

Neste exemplo, o dicionário {"nome": "Alice", "idade": 25} é desempacotado e os pares chave-valor "nome": "Alice" e "idade": 25 são passados como argumentos de palavras-chave para minha_funcao().

O desempacotamento com os operadores asterisco * e ** é uma maneira útil de passar os itens de uma sequência ou dicionário existente como argumentos para uma função. Isso pode ser especialmente útil quando se trabalha com funções que aceitam *args e **kwargs.

Conclusão

Em resumo, os argumentos *args e **kwargs em Python permitem que você passe um número variável de argumentos posicionais e argumentos de palavras-chave para uma função. Eles fornecem flexibilidade ao definir funções que podem receber um número desconhecido de argumentos. Além disso, você pode usar o operador asterisco * para desempacotar sequências e o operador de dois asteriscos ** para desempacotar dicionários.

Agora você pode usar args e kwargs para tornar suas funções mais flexíveis e poderosas em Python. Experimente esses conceitos em suas próprias funções e descubra como eles podem melhorar a eficiência e legibilidade do seu código.

Esperamos que este artigo tenha ajudado a desmistificar args e kwargs em Python. Se você tiver alguma dúvida, deixe um comentário abaixo e teremos prazer em ajudar!