Qu'est-ce que le walrus en Python ?

L'opérateur walrus := arrivé dans la version 3.8 de Python à la suite de la PEP 572, permet d'assigner une valeur à une variable dans une expression. Ce qui permet de faire d'une pierre deux coups : l'assignation et l'utilisation de la variable.

Walrus veut dire morse en français. Vous faites le rapprochement ?

Morse :=

Morse :=

Syntaxe de l'opérateur Walrus

La syntaxe est concise : nom_variable := expression.

Par exemple, on peut assigner la longueur d'une liste à n et utiliser n immédiatement dans une condition :

ma_liste = [1, 2, 3, 4, 5]

if (n := len(ma_liste)) > 3:
    print(f"La liste contient {n} éléments, ce qui est supérieur à 3.")
PYTHON

Dans ce cas on assigne 5 (longueur de la liste) à n, et si n est supérieur à 3 on exécute le bloc conditionnel.

Pourquoi utiliser le walrus ?

Simplifier les boucles

Il permet de réduire la duplication de code dans les boucles while où l'on doit à la fois récupérer une valeur et tester la condition de sortie :

# Demander une entrée utilisateur jusqu'à ce qu'il tape "quitter"
entree = input("Entrez une commande (ou 'quitter'): ")
while entree != "quitter":
    print(f"Commande exécutée : {entree}")
    entree = input("Entrez une commande (ou 'quitter'): ")

# Avec Walrus
# L'assignation se fait directement dans la condition de la boucle
while (entree := input("Entrez une commande (ou 'quitter'): ")) != "quitter":
    print(f"Commande exécutée : {entree}")
PYTHON

Optimiser le code

Dans une condition ou une compréhension de liste, il arrive parfois d'utiliser le résultat d'une fonction pour filtrer et retourner une valeur. Imaginons une fonction appelée deux fois pour chaque élément : une fois dans la condition et une deuxième fois pour construire la liste :

def foo(n):
    # Imaginez un calcul qui prend du temps
    return n * n + 2

valeurs = [1, 2, 3, 4, 5, -1, -2]

# foo() est appelé deux fois
resultats = [foo(v) for v in valeurs if foo(v) > 10]
print(resultats) # [11, 18, 27]

# Avec walrus
def foo(n):
    return n * n + 2

valeurs = [1, 2, 3, 4, 5, -1, -2]

# le résultat est stocké et réutilisé
resultats = [res for v in valeurs if (res := foo(v)) > 10]
print(resultats) # [11, 18, 27]
PYTHON

Quand éviter l'opérateur Walrus ?

Tout simplement quand le code devient compliqué à comprendre. En effet, mal utilisé, le walrus peut rendre le code plus difficile à comprendre. Par exemple, cette ligne n'est pas forcément très lisible :

# Trop d'opérations sur une seule ligne
nombres = [1, 2, 3]
total = 0
print([total := total + x for x in nombres]) # Affiche [1, 3, 6]
PYTHON

De plus on crée un effet de bord : la variable total est modifiée, ce qui n'est pas le but recherché par une compréhension de liste.

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.