L'opérateur walrus (:=), ou l'opérateur d'affectation d'expression, est apparu dans Python à partir de la version 3.8. Il a été introduit pour permettre l'affectation d'une valeur à une variable directement dans les expressions (par exemple, dans les conditions des boucles ou des if), c'est-à-dire obtenir et utiliser le résultat d'une fonction ou d'un calcul immédiatement, sans répéter l'appel deux fois.
Le problème résolu par l'opérateur walrus est la nécessité de dupliquer les calculs ou d'écrire des lignes de code superflues uniquement pour l'affectation : avant son apparition, il fallait faire un appel séparé et ensuite utiliser le résultat.
Solution : maintenant, l'expression peut être immédiatement affectée à une variable à l'intérieur de la condition, ce qui rend le code plus concis et, parfois, plus lisible. Il est important de se rappeler que parfois, une utilisation excessive de walrus complique la compréhension du code, surtout pour des collègues moins expérimentés.
Exemple de code :
while (line := input('Entrez une chaîne : ')) != 'exit': print(f'Vous avez saisi : {line}')
Caractéristiques clés :
Peut-on utiliser l'opérateur walrus pour affecter une valeur à une variable globale ?
Oui, on peut, cependant, walrus fonctionne dans le champ d'application où il a été appliqué. Il faut se souvenir de la règle LEGB et utiliser les variables hors des fonctions avec précaution.
Quelle est la différence entre x = expr et (x := expr) ?
x = expr est une instruction d'affectation autonome, tandis que (x := expr) est une expression qui retourne le résultat de expr et l'affecte à x à l'intérieur d'une autre expression. Dans de nombreux cas, le second peut être utilisé dans les conditions if, dans la boucle while ou dans les expressions de liste.
L'opérateur walrus peut-il être utilisé à l'intérieur d'expressions de liste et de générateurs ?
Oui, walrus est couramment utilisé dans les compréhensions, ce qui est particulièrement pratique pour éviter les recalculs.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Ici n conserve le résultat int(s), économisant des calculs
Un développeur écrit un long et complexe if avec plusieurs walrus imbriqués :
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Avantages :
Inconvénients :
Utilisation consciente pour économiser des calculs et pour la lisibilité :
while (line := sys.stdin.readline()) != '': process(line)
Avantages :
Inconvénients :