operateur-morse

Qu’est-ce que le nouvel opérateur morse de Python 3.8 ?

Emmanuel Jakobowicz Mis à jour le : 13 novembre 2019 méthode Laissez un commentaire

Avec la sortie de la version définitive de Python 3.8.0 en octobre 2019 (les nouveautés), Python vient de se doter d’un nouvel opérateur communément appelé opérateur morse (Walrus operator). Cet opérateur peut avoir des avantages mais comporte aussi quelques risques.

Attention tout le code se trouvant dans cet article ne fonctionne que sous Python 3.8. Si vous utilisez Anaconda et que vous voulez tester le code de cet article, vous pouvez utilisez ces commandes dans votre terminal pour créer et activer un environnement adapté :

> conda create -n py38 python=3.8
> activate py38
> conda install numpy

Qu’est-ce que l’opérateur morse ?

L’opérateur que l’on nomme opérateur morse est un opérateur noté := et permettant de simultanément faire une allocation et un test dans la même expression. Il est associé à ce nom du fait de sa ressemblance avec l’animal (les yeux et les défenses).

Il permet de transformer un code comme celui-ci :

import numpy as np

# on crée une matrice de nombres aléatoires
data = np.random.random(1000).reshape(100,10)
n_col = data.shape[1]

if n_col > 10 :
    print("Nombre de colonnes : {}".format(n_col))
elif n_col == 10 :
    print("On a bien 10 colonnes")

En celui-ci :

import numpy as np

# on crée une matrice de nombres aléatoires
data = np.random.random(1000).reshape(100,10)

if (n_col := data.shape[1]) > 10 :
    print("Nombre de colonnes : {}".format(n_col))
elif n_col == 10 :
    print("On a bien 10 colonnes")

On a ainsi économisé en ajoutant l’opération d’allocation à l’intérieur de la condition. Cette nouvelle approche peut être intéressante mais il faut garder à l’esprit que Python se veut un langage simple et l’ajout d’un opérateur qui complexifierait votre code doit se faire avec précautions.

Quand est-ce que c’est intéressant ?

Dans le code précédent, l’intérêt n’est pas certain. On peut imaginer d’autres applications.

Dans une list comprehension :

liste_init = ["Python","PEP","conda"]

liste_filtree = [x.upper() for x in liste_init if "P" in x.upper()] 

Par :

liste_init = ["Python","PEP","conda"]

liste_filtree = [y for x in liste_init if "P" in (y:=x.upper())] 

Dans une boucle while, on utilise ici python pour lire les lignes d’un fichier texte :

fichier_python = open("python.txt")
# on fait une boucle sur les lignes jusqu'à
# trouver le mot python
line = fichier_python.readline()
while line:
    if "python" in line:
        print("On a trouvé python") 
        break
        
    line = fichier_python.readline()

Avec l’opérateur morse, on peut l’écrire :

fichier_python = open("python.txt")
# on fait une boucle sur les lignes jusqu'à
# trouver le mot python
while line := fichier_python.readline():
    if "python" in line:
        print("On a trouvé python") 
        break

On gagne encore quelques lignes de code et des allocations non nécessaires.

Attention aux parenthèses

En effet, l’utilisation des parenthèses est très importante, dans la condition du début de cet article, si vous placez mal ou oubliez les parenthèses, le résultat est alors différent. Illustration :

if (n_col := data.shape[1]) > 10 :
    print("Nombre de colonnes : {}".format(n_col))
# dans ce cas n_col est un entier associé à la seconde 
# dimension de notre matrice data


if n_col := data.shape[1] > 10 :
    print("Nombre de colonnes : {}".format(n_col))
# dans ce cas n_col est un booléen qui vaut True si la 
# condition >10 est remplie et False dans le cas contraire

En savoir plus

Vous voulez en savoir plus, je vous conseille ce talk au sujet de l’opérateur morse := :

Et vous qu’en pensez-vous ?

N’hésitez pas à partager vos impressions sur ce nouvel opérateur dans les commentaires.

Nos formations Python pour monter en compétence et découvrir le langage Python pour la data

Partager cet article

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.