Les paramètres des fonctions en Python

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.
# 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 ».

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