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 :=
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.")
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}")
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]
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]
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.