Python 3.9 en 3 nouveautés
La version 3.9 de Python a été publiée le 5 octobre 2020, apportant comme chaque mise-à-jour son lot de nouveautés, aussi bien en terme d'améliorations de l'interpréteur CPython, qu'au niveau de la syntaxe.
Plébiscité pour sa syntaxe simple et épurée, Python n'en demeure pas moins un langage puissant, permettant de réaliser des opérations complexes en un minimum d'instructions.
Un mois après sa sortie, petit tour d'horizon de trois principales nouveautés syntaxiques, dont l'une particulièrement attendue par les développeurs.
L'opérateur d'union de dict
Il existait jusqu'ici plusieurs manières différentes de fusionner deux dict
en Python, parmi elles :
- La méthode
dict1.update(dict2)
, permettant de dupliquer le contenu dudict2
dans le dictionnairedict1
, et mettre à jour les valeurs correspondant aux clés existantes dansdict1
dans le cas où celles-ci sont présentes également dansdict2
.
Cette méthode, la plus utilisée jusqu'ici, présente l'inconvénient de modifier le dictionnaire
dict1
. Une astuce consiste à travailler sur une copie de ce dictionnaire.
- La déstructuration / fusion de dictionnaires :
{**dict1, **dict2}
, permettant de créer un nouveau dictionnaire à partir des clés et des valeurs dedict1
etdict2
, les valeurs des clés éventuellement identiques seront écrasées par celles dedict2
.
Cette méthode est plus efficace, mais peu esthétique et lisible, elle est difficilement compréhensible par des débutants notamment.
La PEP 584 a introduit un nouvel opérateur d'union de dictionnaires : la barre verticale |
qui vient compléter ces deux solutions existantes.
dict1 = {'pomme': 2.29, 'poire': 1.99, 'peche': 3.19}
dict2 = {'pasteque': 2.99, 'papaye': 4.19, 'pomme': 1.89}
dict3 = dict1 | dict2
print(dict3)
# {'pomme': 1.89, 'poire': 1.99, 'peche': 3.19, 'pasteque': 2.99, 'papaye': 4.19}
Un nouveau dictionnaire est retourné suite à cette union. Les clés du dictionnaire se trouvant à droite de l'opérateur écrasent celles déjà présentes dans le dictionnaire de gauche.
L'opérateur |=
joue le même rôle que la méthode update()
:
dict1 = {'pomme': 2.29, 'poire': 1.99, 'peche': 3.19}
dict2 = {'pasteque': 2.99, 'papaye': 4.19, 'pomme': 1.89}
dict1 |= dict2
print(dict1)
# {'pomme': 1.89, 'poire': 1.99, 'peche': 3.19, 'pasteque': 2.99, 'papaye': 4.19}
À noter que comme l'opérateur +=
pour les list
, cette opération ne modifie pas la référence de l'objet dict1
.
Pourquoi ne pas avoir utilisé simplement l'opérateur de concaténation +
, comme cela est déjà le cas pour les list
et les tuple
🤔 ?
Cette idée fut initialement proposée, mais a suscité la controverse au sein de la communauté de développeurs Python et a fini par être rejetée.
En effet, il ne s'agit pas véritablement de concaténation qui est réalisée ici, plus plutôt "d'union". On ne se contente pas simplement de fusionner les dictionnaires, on met également à jour les clés identiques. D'où l'idée de créer un opérateur spécifique.
Nouvelles méthodes sur les chaînes de caractères
Le type str
s'est vu enrichir de deux nouvelles méthodes d'opération sur les chaînes de caractères : removeprefix()
et removesuffix()
(PEP 616).
Très simplement, ces méthodes suppriment le texte passé en paramètre, si celui-ci se trouve en préfixe / suffixe de la chaîne de caractères. Le type str
étant immuable, ces méthodes ne modifient pas la chaîne de caractères, mais retourne la chaîne éventuellement raccourcie.
Quelques exemples fournis par la documentation :
chaine = 'TestHook'.removeprefix('Test')
print(chaine)
# 'Hook'
chaine = 'BaseTestCase'.removeprefix('Test')
print(chaine)
# 'BaseTestCase'
chaine = 'MiscTests'.removesuffix('Tests')
print(chaine)
# 'Misc'
chaine = 'TmpDirMixin'.removesuffix('Tests')
print(chaine)
# 'TmpDirMixin'
Utilisation des types génériques pour les types hints
Introduits avec la version 3.5, les types hints continuent d'être améliorés au fil des mises-à-jour.
Pour rappel, il s'agit simplement d'indications de type ne remettant nullement en cause la nature implicite et dynamique du typage en Python. Elle précisent seulement le type de donnée qu'une variable devrait contenir, mais n'effectuent pas de vérification. Les IDE peuvent afficher des avertissement si le type n'est pas respecté, mais rien de plus. Ils peuvent cependant être exploités par des librairies externes, ou à l'aide de décorateurs.
Avec des types hints, on peut indiquer d'une variable devrait contenir une list
de str
, ou bien un tuple
de tuple
de dict
, ainsi de suite ... Cependant, cette prise en charge était jusqu'ici partielle, et nécessitait bien souvent des imports à partir du module typing
.
La PEP 585 a amélioré la syntaxe, et l'utilisation du module typing
n'est désormais plus nécessaire : il suffit simplement d'indiquer le type natif.
Un exemple pour illustrer : je souhaite indiquer une variable devrait contenir une list
de int
.
Avant Python 3.9 :
from typing import List
ma_liste: List[int] = [1, 2, 3, 4]
Avec Python 3.9 :
ma_liste: list[int] = [1, 2, 3, 4]
Beaucoup plus simple, non ? 😉
Quoi d'autre ?
La version 3.9 a apporté d'autres nouveautés.
En terme de syntaxe notamment, l'écriture de décorateurs a été légèrement simplifiée.
La communauté de développeurs a adopté un rythme de publication annuel : jusqu'ici les différentes versions Python 3 étaient publiées selon un cycle relativement aléatoire (9 versions en 12 ans). Désormais, chaque nouvelle version sera disponible aux alentours du mois d'octobre. On peut donc s'attendre à une version 3.10 en octobre 2021. Eh oui, pas de version 4 attendue pour le moment !
La liste complète des nouveautés est disponible sur la documentation officielle.