*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.

  2. 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

Sign in to your account

By continuing, you agree to our Terms of Service and Privacy Policy.