Como usar *args e **kwargs em funções Python

Domine *args e **kwargs em Python. Aprenda como escrever funções flexíveis com argumentos posicionais e de palavras-chave dinâmicos, descompactar coleções e criar funções wrapper.

Experimente esta solução no Editor

Visão geral

Em Python, muitas vezes você precisará projetar funções que possam aceitar um número variável de argumentos. Por exemplo, uma função que calcula a soma de qualquer número de números inteiros ou uma função que registra metadados com campos variados. Em vez de forçar os usuários a passar uma lista ou dicionário, Python fornece dois símbolos especiais: `*args` e `**kwargs`.

A sintaxe `*args` permite que uma função aceite qualquer número de argumentos posicionais. O único asterisco `*` atua como um operador de descompactação. Quando colocado em uma definição de função, ele coleta argumentos posicionais extras em uma tupla chamada `args`. Isso permite iterar os valores de entrada, executar cálculos ou passá-los para outra função com facilidade.

A sintaxe `**kwargs`, por outro lado, permite que uma função aceite qualquer número de argumentos de palavras-chave (nomeados). O asterisco duplo `**` coleta esses argumentos em um dicionário chamado `kwargs`. Isso é extremamente útil para passar configurações opcionais, estilizar argumentos ou atributos de banco de dados. Lembre-se, os nomes 'args' e 'kwargs' são convenções; a funcionalidade real é orientada pelos asteriscos simples e duplos.

Saída de código e execução

Este código demonstra o uso de *args para somar números de variáveis, **kwargs para imprimir perfis de usuário e combinar ambos em uma única função.

args_kwargs.py
Experimente no Editor
def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

def print_profile(**kwargs):
    print("kwargs type:", type(kwargs).__name__)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
Saída terminal
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

Implementação passo a passo

  • Use um único asterisco antes de um parâmetro (por exemplo, *args) para reunir argumentos posicionais em uma tupla.
  • Use um asterisco duplo antes de um parâmetro (por exemplo, **kwargs) para reunir argumentos de palavras-chave em um dicionário.
  • Mantenha a ordem correta dos parâmetros: parâmetros padrão, *args, parâmetros somente de palavras-chave e, em seguida, **kwargs.
  • Use a sintaxe de descompactação ao chamar funções passando *iterable ou **dictionary.

Perguntas frequentes

Devo usar os nomes "args" e "kwargs"?

Não, estas são convenções comunitárias padrão. Apenas os prefixos * e ** são sintaticamente necessários. Você poderia escrever *valores e **opções, mas aderir a *args e **kwargs é altamente recomendado para facilitar a leitura.

Qual é a ordem correta ao definir uma função?

A ordem correta dos argumentos em uma assinatura de função é: argumentos posicionais, *args, argumentos somente de palavras-chave e, finalmente, **kwargs.

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.