*args e **kwargs

*args

A linguagem Python fornece uma forma de lidar com um número arbitrário de argumentos numa função através de símbolos especiais. Esses símbolos são * e **, e são usados antes dos nomes das variáveis para indicar *args e **kwargs, respectivamente. Pode dar aos parâmetros *args ou **kwargs qualquer nome que quiser, mas por convenção são chamados de args (argumentos) e kwargs (argumentos de palavra-chave).
O *args é usado para enviar um número arbitrário de argumentos para a função sem palavras-chave. Aqui está um exemplo:
def add(*args):
    res = 0             # Inicializa o resultado final com 0
    for num in args:    # Percorre a lista de argumentos passados
        res += num      # Adiciona cada número à soma
    return res

print(add(3, 5, 7, 9))  # 24
Neste programa, args é uma tupla com os valores que passamos para a função. Assim, no exemplo acima, args é igual a (3, 5, 7, 9). Desta forma, podemos passar qualquer número de argumentos para a nossa função.

**kwargs

O **kwargs permite-nos passar um número arbitrário de argumentos com palavras-chave. Em outras palavras, usamos **kwargs para passar qualquer número de argumentos nomeados para a nossa função. Aqui está um exemplo:
def introduce(**kwargs):
    for key, value in kwargs.items():  # Percorre todos os pares chave-valor
        print(f'{key}: {value}')       # Imprime cada par chave-valor

introduce(Name='Alice', Age=25, Country='USA')  
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'
No programa acima, kwargs é um dicionário com pares chave-valor que passamos para a função. Assim, no exemplo acima, kwargs é igual a {'Name': 'Alice', 'Age': 25, 'Country': 'USA'}.
Também pode combinar *args e **kwargs numa chamada de função. O *args deve vir antes de **kwargs.
def combined_example(*args, **kwargs):
    print(args)    # Imprime a tupla de argumentos
    print(kwargs)  # Imprime o dicionário de argumentos nomeados

combined_example(1, 2, 3, Name='Alice', Age=25)  
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}
Nesta função, args é uma tupla com os valores (1, 2, 3) e kwargs é um dicionário com os valores {'Name': 'Alice', 'Age': 25}.
Esta flexibilidade de manipular qualquer número de argumentos e argumentos nomeados pode ser realmente útil quando se pretende que as funções sejam mais dinâmicas e versáteis.

Combinando *args e **kwargs com argumentos regulares da função

O *args e o **kwargs podem ser usados em combinação com argumentos regulares da função. Nestes casos, é preciso ter em mente algumas regras:
  1. A ordem correta dos argumentos na definição da função deve ser: argumentos padrão, *args, depois **kwargs.
  1. Os argumentos padrão (também conhecidos como argumentos posicionais) devem ser sempre especificados antes de *args e **kwargs.
def function_example(a, b, *args, **kwargs):
    print(a)       # Imprime o primeiro argumento padrão
    print(b)       # Imprime o segundo argumento padrão
    print(args)    # Imprime argumentos adicionais não nomeados
    print(kwargs)  # Imprime argumentos nomeados

function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}
Aqui, 1 e 2 são argumentos padrão que correspondem a a e b na definição da função. A tupla (3, 4, 5) representa argumentos adicionais que são agrupados em args. Os argumentos nomeados restantes são agrupados em kwargs como um dicionário.
Ao usar *args e **kwargs com argumentos padrão, certifique-se de que os argumentos padrão não sejam esquecidos ao chamar a função, pois isso geraria um TypeError. Por exemplo, chamar function_example(1, Name='Alice', Age=25) sem fornecer um valor para o argumento b resultaria em um erro.
 
To check your solution you need to sign in
Sign in to continue