Paramètre

Un paramètre est le nom donné aux éléments contenus entre les parenthèses dans la définition d'une fonction ou d'une méthode.

Dans le code suivant on a donc trois paramètres : a, b, et c :

def add(a, b, c):
    return a + b + c

resultat = add(1, 2, 3)
print(resultat)

Vous pouvez définir des valeurs par défaut pour les paramètres directement dans la définition de la fonction :

def add(a=1, b=2, c=3):
    return a + b + c

resultat = add()
print(resultat)

En définissant des valeurs par défaut, vous n'êtes ainsi pas obligés de passer des valeurs à ces paramètres lors de l'appel de la fonction. En cas d'absence d'argument, les valeurs par défaut seront utilisées.

Si cependant vous passez une valeur en argument à un des paramètres, cette valeur sera prioritaire sur la valeur par défaut :

def add(a=1, b=2, c=3):
    print('a', a)
    print('b', b)
    print('c', c)
    return a + b + c

# On utilise les valeurs par défaut de a et c mais on indique une valeur pour le paramètre b
resultat = add(b=5)
print(resultat)

Vous ne pouvez pas définir des paramètres sans valeur par défaut après un paramètre qui possède une valeur par défaut :

def add(a=0, b=1, c):
    return a + b + c

resultat = add(c=10)
print(resultat)

Le code ci-dessus vous retournera une erreur de syntaxe (SyntaxError: non-default argument follows default argument).

Pour éviter cette erreur, vous avez deux options :

  1. Placer le paramètre c avant les paramètres qui contiennent des valeurs par défaut.
  2. Donner une valeur par défaut au paramètre c.
#norun
# On donne une valeur par défaut à c
def add(a=0, b=1, c=2):
    return a + b + c

# On place c au début de la liste des paramètres
def add(c, a=0, b=1):
    return a + b + c

Les paramètres « positionnels uniquement »

Les paramètres « positionnels uniquement » ne sont disponibles qu'à partir de la version 3.8 de Python avec la PEP 570.

Vous pouvez indiquer qu'un paramètre n'acceptera que des arguments passés de façon 'positionnelle'.

Les paramètres « positionnels uniquement » sont placés avant un /.

Prenons l'exemple de notre fonction add :

def add(a, b):
    return a + b

a_before_b = add(a=2, b=3)
b_before_a = add(b=3, a=2)

print(a_before_b)
print(b_before_a)

☝️ Dans le code ci-dessus, nous pouvons passer des valeurs en argument aux paramètres a et b en les nommant.

Cela nous permet par exemple d'intervertir la position des arguments lors de l'appel de la fonction.

Si vous souhaitez empêcher cette possibilité, il suffit de rajouter un / après les deux premiers paramètres.

Le slash n'est pas considéré comme un paramètre, il s'agit d'un caractère spécial qui indique que les paramètres avant le slash doivent être considérés comme « positionnels uniquement ».
#norun
def add(a, b, /):
    return a + b

# Si vous spécifiez le nom des paramètres lors de l'appel de la fonction, vous aurez une erreur
# TypeError: add() got some positional-only arguments passed as keyword arguments: 'a, b'
add(a=2, b=3)

# Vous ne pouvez donc appeler la fonction que de cette façon, sans spécifier le nom des paramètres
add(2, 3)


# Si on déplace le slash, seul le paramètre a sera 'positionnel uniquement'
def add(a, /, b):
    return a + b

add(2, b=10)   # Valide
add(2, 3)      # Valide
add(a=2, b=3)  # Erreur