Quando programamos em Python, podemos usar argumentos posicionais, argumentos nomeados ou uma combinação de ambos ao definir e chamar funções. O uso destes argumentos pode melhorar a legibilidade e a flexibilidade do código.
Argumentos Posicionais
Argumentos posicionais são aqueles que devem ser passados para uma função na ordem correta. Aqui está um exemplo onde construímos uma função simples para gerar um nome completo:
def full_name(first_name, last_name):
return f'{first_name} {last_name}' # Combina o primeiro e o último nome
print(full_name('Anna', 'Brown')) # Imprime 'Anna Brown'
No exemplo acima, Anna é o primeiro argumento e Brown é o segundo argumento. Se invertermos a ordem dos argumentos, veremos resultados diferentes:
Em contraste, os argumentos nomeados permitem-nos especificar o nome do argumento quando o passamos para a função, melhorando a legibilidade do nosso código. Além disso, podemos usá-los para estabelecer valores padrão para argumentos opcionais.
Isto produz o mesmo resultado que o primeiro exemplo, independentemente da ordem dos argumentos.
💡
É importante notar que, ao chamar uma função, os argumentos nomeados devem sempre seguir os argumentos posicionais.
Se argumentos nomeados forem usados antes de argumentos posicionais numa chamada de função, o Python irá gerar um erro de sintaxe. Esta regra ajuda o Python a distinguir entre os dois. Se os argumentos posicionais vierem após os argumentos nomeados, o interpretador do Python fica confuso porque espera que todos os argumentos posicionais já tenham sido definidos. Aqui está um exemplo de uma chamada de função incorreta que levantaria um SyntaxError:
Esta regra garante que as chamadas de função sejam inequívocas, tornando o código mais fácil de compreender e menos propenso a erros.
Combinando Argumentos Posicionais e Nomeados
Considere esta função que formata um nome completo, incluindo um nome do meio:
# Valores padrão para os nomes do meio e último (strings vazias)
def full_name(first, middle='', last=''):
return first + ' ' + middle + ' ' + last
print(full_name('Anna', last='Brown')) # 'Anna Brown'
print(full_name('Anna', middle='Louise', last='Brown')) # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', last='Brown')) # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', 'Brown')) # 'Anna Louise Brown'
print(full_name(first='Anna', 'Louise', last='Brown')) # SyntaxError
Neste exemplo, o primeiro nome é fornecido como um argumento posicional, enquanto o último nome é um argumento nomeado. O nome do meio não é fornecido, portanto utiliza o seu valor padrão (uma string vazia).
Uma regra importante é que, uma vez que se começa a usar argumentos nomeados, todos os argumentos seguintes devem ser argumentos nomeados. Por exemplo, print(full_name(first='Anna', 'Louise', last='Brown')) geraria um erro porque um argumento posicional (Louise) está a seguir a um argumento nomeado (first='Anna').
Finalmente, vamos considerar um exemplo mais complexo do mundo real: uma função que calcula o custo total de uma compra com parâmetros opcionais para imposto e desconto.
# Valores padrão para imposto e desconto são definidos como 0
def calculate_total_cost(price, tax=0.0, discount=0.0):
return price + price * tax - discount
print(calculate_total_cost(100, tax=0.05)) # 105.0
print(calculate_total_cost(100, discount=10)) # 90.0
print(calculate_total_cost(100, tax=0.05, discount=10)) # 95.0
Neste caso, o preço é um argumento posicional obrigatório, enquanto imposto e desconto são argumentos opcionais nomeados. Se não forem fornecidos, assumirão os seus valores padrão de 0.