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:
A ordem correta dos argumentos na definição da função deve ser: argumentos padrão, *args, depois **kwargs.
Os argumentos padrão (também conhecidos como argumentos posicionais) devem ser sempre especificados antes de *args e **kwargs.
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.