Arguments positionnels et arguments nommés

Lors de la programmation en Python, on peut utiliser des arguments positionnels, des arguments nommés, ou une combinaison des deux lors de la définition et de l'appel de fonctions. L'utilisation de ces arguments peut améliorer la lisibilité et la flexibilité du code.

Arguments positionnels

Les arguments positionnels sont ceux qui doivent être passés à une fonction dans le bon ordre. Voici un exemple où nous construisons une fonction simple pour générer un nom complet :
def full_name(first_name, last_name):
    return f'{first_name} {last_name}'  # Combine le prénom et le nom de famille

print(full_name('Anna', 'Brown'))       # Affiche 'Anna Brown'
Dans l'exemple ci-dessus, Anna est le premier argument, et Brown est le second argument. Si nous inversons l'ordre des arguments, nous obtiendrons des résultats différents :
print(full_name('Brown', 'Anna'))       # Affiche 'Brown Anna'

Arguments nommés

À l'inverse, les arguments nommés nous permettent de spécifier le nom de l'argument lorsque nous le passons à la fonction, améliorant ainsi la lisibilité de notre code. De plus, nous pouvons les utiliser pour établir des valeurs par défaut pour les arguments optionnels.
def full_name(first_name, last_name):
    return f'{first_name} {last_name}'

print(full_name(last_name='Brown', first_name='Anna'))  # Affiche 'Anna Brown'
print(full_name(first_name='Anna', last_name='Brown'))  # Affiche 'Anna Brown'
Cela produit le même résultat que le premier exemple, quel que soit l'ordre des arguments.
 
💡
Il est important de noter que les arguments nommés doivent toujours suivre les arguments positionnels lors de l'appel d'une fonction.
Si des arguments nommés sont utilisés avant des arguments positionnels dans un appel de fonction, Python générera une erreur de syntaxe. Cette règle aide Python à différencier les deux. Si les arguments positionnels suivent des arguments nommés, l'interpréteur Python est confus car il s'attend à ce que tous les arguments positionnels aient déjà été définis. Voici un exemple d'appel de fonction incorrect qui provoquerait une SyntaxError :
def greet(first_name, last_name):
    print('Hello', first_name, last_name)

greet(last_name='Doe', 'John')
# SyntaxError: positional argument follows keyword argument
Cette règle garantit que les appels de fonction sont sans ambiguïté, ce qui rend le code plus facile à comprendre et moins sujet aux bugs.

Combiner les arguments positionnels et nommés

Considérons cette fonction qui formate un nom complet, y compris un deuxième prénom :
# Valeurs par défaut pour middle et last (chaînes vides)
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
Dans cet exemple, le prénom est fourni en tant qu'argument positionnel, tandis que le nom de famille est un argument nommé. Le deuxième prénom n'est pas fourni, donc il utilise sa valeur par défaut (une chaîne vide).
Une autre règle importante est qu'une fois que vous avez commencé à utiliser des arguments nommés, tous les arguments suivants doivent être des arguments nommés. Par exemple, print(full_name(first='Anna', 'Louise', last='Brown')) générerait une erreur parce qu'un argument positionnel (Louise) suit un argument nommé (first='Anna').
Enfin, considérons un exemple du monde réel plus complexe : une fonction qui calcule le coût total d'un achat avec des paramètres optionnels pour la taxe et la remise.
# Les valeurs par défaut pour tax et discount sont fixées à 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
Dans ce cas, le prix est un argument positionnel requis, tandis que tax et discount sont des arguments nommés optionnels. S'ils ne sont pas fournis, ils prendront leurs valeurs par défaut de 0.
 
To check your solution you need to sign in
Sign in to continue