Qu'est-ce que l'opérateur walrus (:=) en Python ?

Découvrez l'opérateur walrus (:= ) en Python : syntaxe, cas d'utilisation, exemples pratiques et bonnes pratiques pour écrire un code plus concis et lisible.
10 min de lecture
Believemy logo

Définition de l'opérateur walrus en Python

L'opérateur walrus, introduit avec Python 3.8 (PEP 572), est un opérateur d'assignation par expression noté :=. Son nom officiel est assignment expression, mais la communauté l'a surnommé "walrus" (morse en anglais) car le symbole := ressemble aux yeux et aux défenses d'un morse tourné sur le côté.

Contrairement à l'opérateur d'assignation classique =, l'opérateur walrus permet d'assigner une valeur à une variable tout en l'utilisant dans une expression. Cela signifie que vous pouvez effectuer une affectation et utiliser immédiatement le résultat dans la même ligne de code, ce qui rend certaines constructions beaucoup plus concises.

Si vous souhaitez maîtriser ce type de fonctionnalités avancées et toutes les subtilités du langage, notre formation complète sur Python vous guidera pas à pas dans votre apprentissage.

Bon à savoir

L'opérateur walrus := est un outil puissant pour réduire la redondance dans votre code, mais il doit être utilisé avec discernement pour ne pas nuire à la lisibilité.

 

Syntaxe de l'opérateur walrus

La syntaxe de l'opérateur walrus est simple :

PYTHON
(variable := expression)

L'expression est évaluée, sa valeur est assignée à variable, et cette même valeur est retournée pour être utilisée dans le contexte environnant. Les parenthèses sont souvent nécessaires pour éviter les ambiguïtés syntaxiques.

Voyons un exemple minimal pour bien comprendre la différence avec une assignation classique :

PYTHON
# Assignation classique (instruction)
x = 10
print(x)  # 10

# Avec l'opérateur walrus (expression)
print(y := 20)  # 20 — y est assigné ET affiché en même temps

Dans le premier cas, l'assignation et l'affichage sont deux instructions séparées. Dans le second, l'opérateur walrus permet de combiner les deux en une seule ligne grâce à la fonction print.

 

Différence entre = et :=

Il est essentiel de bien comprendre ce qui distingue ces deux opérateurs :

CaractéristiqueAssignation classique =Opérateur walrus :=
TypeInstruction (statement)Expression
Utilisable dans une expressionNonOui
Contexte d'utilisationPartout comme instructionDans des conditions, boucles, compréhensions
Version Python minimaleToutes3.8+
Parenthèses requisesNonSouvent oui

Le point clé est que = est une instruction : elle ne peut pas être placée à l'intérieur d'une expression comme un appel de fonction ou une condition if. L'opérateur walrus :=, en revanche, est une expression qui retourne une valeur, ce qui le rend utilisable dans ces contextes.

 

Exemples pratiques de l'opérateur walrus

Utilisation dans une boucle while

L'un des cas d'utilisation les plus courants de l'opérateur walrus est la lecture de données dans une boucle while. Sans walrus, vous devez souvent dupliquer l'appel de lecture :

PYTHON
# Sans opérateur walrus
ligne = input("Entrez un texte (ou 'quit' pour arrêter) : ")
while ligne != "quit":
    print(f"Vous avez écrit : {ligne}")
    ligne = input("Entrez un texte (ou 'quit' pour arrêter) : ")

Remarquez que l'appel à input() est dupliqué. Avec l'opérateur walrus, nous pouvons simplifier ce code :

PYTHON
# Avec l'opérateur walrus
while (ligne := input("Entrez un texte (ou 'quit' pour arrêter) : ")) != "quit":
    print(f"Vous avez écrit : {ligne}")

Le code est plus concis et élimine la duplication. La variable ligne reçoit la valeur de input() et est immédiatement comparée à "quit" dans la même expression. Notez l'utilisation d'une f-string pour l'affichage formaté.

 

Utilisation dans une condition if

L'opérateur walrus est également très utile dans les conditions if pour éviter de calculer deux fois la même chose :

PYTHON
# Sans opérateur walrus
resultats = rechercher_utilisateur("Alice")
if resultats:
    print(f"{len(resultats)} résultat(s) trouvé(s)")
    traiter(resultats)

# Avec l'opérateur walrus
if (resultats := rechercher_utilisateur("Alice")):
    print(f"{len(resultats)} résultat(s) trouvé(s)")
    traiter(resultats)

Ici, l'appel à rechercher_utilisateur() est effectué une seule fois, et le résultat est à la fois assigné à resultats et évalué comme condition. La fonction len nous permet ensuite de connaître le nombre de résultats.

 

Utilisation avec des expressions régulières

Un autre cas d'utilisation classique est le traitement de correspondances d'expressions régulières (regex) :

PYTHON
import re

texte = "Mon email est contact@believemy.com"

# Sans opérateur walrus
match = re.search(r'[\w.+-]+@[\w-]+\.[\w.-]+', texte)
if match:
    print(f"Email trouvé : {match.group()}")

# Avec l'opérateur walrus
if (match := re.search(r'[\w.+-]+@[\w-]+\.[\w.-]+', texte)):
    print(f"Email trouvé : {match.group()}")

Ce pattern est extrêmement courant dans le code Python professionnel, surtout quand vous enchaînez plusieurs tentatives de correspondance avec des elif.

 

Utilisation dans les compréhensions de listes

L'opérateur walrus peut éviter des calculs redondants dans les compréhensions de list :

PYTHON
# Sans opérateur walrus — calcul_couteux() est appelé deux fois par élément
resultats = [
    calcul_couteux(x)
    for x in donnees
    if calcul_couteux(x) > seuil
]

# Avec l'opérateur walrus — calcul_couteux() n'est appelé qu'une seule fois
resultats = [
    y
    for x in donnees
    if (y := calcul_couteux(x)) > seuil
]

Dans le second exemple, la valeur de calcul_couteux(x) est assignée à y dans le filtre if, puis réutilisée dans l'expression de la compréhension. Cela peut représenter un gain de performance significatif lorsque la fonction est coûteuse en temps de calcul.

 

Utilisation avec la lecture de fichiers

La lecture de fichiers par blocs est un cas d'utilisation élégant :

PYTHON
# Lecture d'un fichier par blocs de 1024 octets
with open("gros_fichier.txt", "r") as f:
    while (bloc := f.read(1024)):
        traiter_bloc(bloc)

Sans l'opérateur walrus, vous auriez besoin d'une structure plus verbeuse avec une pré-lecture et une relecture à chaque itération de la boucle.

 

Utilisation dans un dictionnaire

Vous pouvez également utiliser le walrus pour construire des structures de données comme des dict de manière conditionnelle :

PYTHON
donnees_brutes = ["Alice:85", "Bob:92", "Charlie:78", "Diana:95"]

# Filtrer et transformer en un seul passage
excellents = {
    nom: note
    for item in donnees_brutes
    if (parts := item.split(":")) and (nom := parts[0]) and (note := int(parts[1])) >= 90
}

print(excellents)  # {'Bob': 92, 'Diana': 95}
Attention

Attention : enchaîner plusieurs opérateurs walrus dans une même expression peut rapidement nuire à la lisibilité. Préférez la clarté à la concision excessive.

 

Cas d'utilisation avancés

Chaînes de conditions elif

L'opérateur walrus est particulièrement utile quand vous devez tester plusieurs patterns et agir sur le premier qui correspond :

PYTHON
import re

def analyser_commande(texte):
    if (match := re.match(r"créer (\w+)", texte)):
        return f"Création de {match.group(1)}"
    elif (match := re.match(r"supprimer (\w+)", texte)):
        return f"Suppression de {match.group(1)}"
    elif (match := re.match(r"modifier (\w+)", texte)):
        return f"Modification de {match.group(1)}"
    else:
        return "Commande non reconnue"

print(analyser_commande("créer projet"))     # Création de projet
print(analyser_commande("supprimer compte"))  # Suppression de compte

Ce pattern avec def évite de créer des variables temporaires avant chaque condition, rendant le code plus fluide.

 

Validation de données

L'opérateur walrus peut simplifier les chaînes de validation :

PYTHON
def valider_inscription(nom, email, age):
    erreurs = []
    
    if (longueur := len(nom)) < 2:
        erreurs.append(f"Le nom est trop court ({longueur} caractère(s))")
    
    if (pos := email.find("@")) == -1:
        erreurs.append("L'email ne contient pas de @")
    elif not email[pos + 1:]:
        erreurs.append("L'email n'a pas de domaine après le @")
    
    if (age_val := int(age)) < 18:
        erreurs.append(f"Âge insuffisant : {age_val} ans (minimum 18)")
    
    return erreurs if erreurs else None

 

Bonnes pratiques

L'opérateur walrus est un outil puissant, mais comme tout outil, il doit être utilisé judicieusement. Voici les règles essentielles à respecter :

Quand utiliser l'opérateur walrus

  • Éliminer la duplication : quand vous devez utiliser le résultat d'une expression à la fois comme condition et comme valeur.
  • Boucles while avec lecture : lecture de fichiers, entrées utilisateur, sockets, etc.
  • Compréhensions avec filtre : quand le filtre if calcule une valeur réutilisée dans l'expression.
  • Chaînes de conditions regex : tester plusieurs patterns dans des if/elif.
  • Optimisation de performance : éviter d'appeler une fonction coûteuse plusieurs fois.

 

Quand éviter l'opérateur walrus

  • Quand une assignation simple suffit : n'utilisez pas := simplement pour tout mettre sur une ligne.
  • Dans des expressions trop complexes : si l'expression devient difficile à lire, utilisez des variables intermédiaires.
  • Avec des effets de bord multiples : évitez d'enchaîner plusieurs := dans la même expression.
  • Pour des assignations de haut niveau : au niveau du module, préférez l'assignation classique =.
Bon à savoir

Le guide de style PEP 8 recommande d'utiliser l'opérateur walrus uniquement quand il améliore clairement la lisibilité ou élimine une duplication évidente.

 

Erreurs courantes et pièges à éviter

Oublier les parenthèses

L'opérateur walrus a une priorité basse, ce qui rend les parenthèses souvent obligatoires :

PYTHON
# ❌ Erreur de syntaxe ou comportement inattendu
if x := get_valeur() > 0:  # x reçoit le résultat de get_valeur() > 0 (un booléen !)
    print(x)

# ✅ Correct
if (x := get_valeur()) > 0:  # x reçoit get_valeur(), puis on compare à 0
    print(x)

 

Confusion de portée dans les compréhensions

Les variables créées par := dans une compréhension peuvent avoir une portée qui déborde :

PYTHON
# La variable 'y' existe après la compréhension !
resultats = [y for x in range(5) if (y := x * 2) > 4]
print(y)  # 8 — la dernière valeur assignée est accessible ici

Ce comportement peut être surprenant. Soyez conscient que la variable assignée par := dans une compréhension est accessible dans la portée englobante, contrairement à la variable d'itération.

 

Utilisation impossible au niveau d'une instruction

Vous ne pouvez pas utiliser := comme une simple instruction d'assignation :

PYTHON
# ❌ Erreur de syntaxe
(x := 10)  # Techniquement valide mais inutile et déconseillé

# ✅ Préférez
x = 10

 

Compatibilité et version Python

L'opérateur walrus a été introduit dans Python 3.8 (octobre 2019). Si vous travaillez avec des versions antérieures, vous ne pourrez pas l'utiliser et obtiendrez une erreur de syntaxe.

Pour vérifier votre version de Python :

PYTHON
import sys
print(sys.version)

# Ou vérifiez avec __name__
if __name__ == "__main__":
    print(f"Python {sys.version_info.major}.{sys.version_info.minor}")

La variable __name__ est ici utilisée dans un pattern classique de vérification du point d'entrée du script.

 

Questions fréquentes

Question

Pourquoi l'opérateur := s'appelle-t-il "walrus" ?

Le surnom "walrus" (morse en français) vient de la ressemblance visuelle du symbole := avec les yeux et les défenses d'un morse vu de côté. Le nom officiel de cette fonctionnalité est "assignment expression" (expression d'assignation), tel que défini dans la PEP 572. Le surnom walrus est devenu si populaire dans la communauté Python qu'il est désormais universellement reconnu.

 

Question

L'opérateur walrus remplace-t-il l'opérateur = classique ?

Non, absolument pas. L'opérateur walrus := et l'assignation classique = ont des rôles différents. L'assignation classique = est une instruction et reste la méthode standard pour assigner des valeurs. L'opérateur walrus := est une expression, conçue pour des cas spécifiques où vous avez besoin d'assigner et d'utiliser une valeur simultanément, comme dans des conditions ou des boucles. Vous devez continuer à utiliser = pour la grande majorité de vos assignations.

 

Question

L'opérateur walrus fonctionne-t-il avec des structures comme les tuples et les listes ?

Oui, l'opérateur walrus fonctionne avec tous les types de données Python, y compris les tuple et les list. Vous pouvez assigner n'importe quelle expression à une variable avec :=. Cependant, vous ne pouvez pas faire de déballage (unpacking) avec le walrus : (a, b := (1, 2)) ne fonctionne pas comme vous pourriez l'espérer. Le walrus assigne l'expression complète à une seule variable.

 

Question

Comment bien apprendre à utiliser l'opérateur walrus en Python ?

Pour maîtriser l'opérateur walrus et toutes les fonctionnalités avancées de Python, la pratique régulière est essentielle. Commencez par des cas simples comme les boucles while avec lecture, puis progressez vers les compréhensions de listes et les chaînes de conditions. Nous vous recommandons de suivre notre formation dédiée à Python qui couvre en détail ces concepts avancés avec des exercices pratiques pour consolider vos compétences.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.