AprÚs un an de développement, une version significative du langage de programmation Python 3.10 a été présentée. Cette nouvelle branche sera maintenue pendant un an et demi, aprÚs quoi des corrections de sécurité seront développées pendant encore trois ans et demi.
SimultanĂ©ment, les tests alpha de la branche Python 3.11 ont dĂ©butĂ© (conformĂ©ment au nouveau calendrier de dĂ©veloppement, le travail sur la nouvelle branche commence cinq mois avant la sortie de la branche prĂ©cĂ©dente et atteint la phase de tests alpha au moment de la sortie suivante). La branche Python 3.11 sera en phase de prĂ©-version alpha pendant sept mois, pĂ©riode durant laquelle de nouvelles fonctionnalitĂ©s seront ajoutĂ©es et des corrections de bogues seront effectuĂ©es. Ensuite, pendant trois mois, des tests de versions bĂȘta seront effectuĂ©s, oĂč l'ajout de nouvelles fonctionnalitĂ©s sera interdit et toute l'attention sera portĂ©e Ă la correction des erreurs. Les deux derniers mois avant la sortie, la branche sera en phase de candidats Ă la sortie, qui aboutira Ă une stabilisation finale.
Parmi les nouveautés ajoutées à Python 3.10 :
- Des opérateurs « match » et « case » pour la correspondance des modÚles ont été implémentés, permettant d'améliorer la lisibilité du code, de simplifier la correspondance des objets Python arbitraires et d'augmenter la fiabilité du code grùce à la possibilité de vérification statique de types avancée. L'implémentation ressemble beaucoup à l'opérateur « match » fourni dans les langages Scala, Rust et F#, qui effectue une comparaison du résultat de l'exécution de l'expression spécifiée avec une liste de modÚles, énumérés dans des blocs basés sur l'opérateur « case ».
def http_error(status): match status: case 400: return « Bad request » case 401|403|404: return « Not allowed » case 418: return « Iâm a teapot » case _: return « Something else »
Il est possible de dĂ©composer des objets, des tuples, des listes et des sĂ©quences arbitraires pour lier des variables en fonction des valeurs existantes. La dĂ©finition de modĂšles imbriquĂ©s est autorisĂ©e, l'utilisation de conditions supplĂ©mentaires « if » dans le modĂšle, l'application de masques (« [x, y, *rest] »), le mappage de paires clĂ©/valeur (par exemple, {« bandwidth »: b, « latency »: l} pour extraire les valeurs « bandwidth » et « latency » d'un dictionnaire), l'extraction de sous-modĂšles (opĂ©rateur « := »), et l'utilisation de constantes nommĂ©es dans le modĂšle. Dans les classes, le comportement lors du mappage peut ĂȘtre configurĂ© Ă l'aide de la mĂ©thode « __match__() ».
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print(«Origine») case Point(0, y): print(f»Y={y}») case Point(x, 0): print(f»X={x}») case Point(): print(«Quelque part ailleurs») case _: print(«Pas un point») match point: case Point(x, y) if x == y: print(f»Y=X à {x}») case Point(x, y): print(f»Pas sur la diagonale») RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print(«Je vois rouge !») case GREEN: print(«L'herbe est verte») case BLUE: print(«Je suis dans le blues :(«)
- La possibilitĂ© d'utiliser des parenthĂšses dans l'instruction with pour rĂ©partir sur plusieurs lignes la dĂ©finition d'un groupe de gestionnaires de contexte a Ă©tĂ© ajoutĂ©e. Il est Ă©galement permis de laisser une virgule aprĂšs le dernier gestionnaire de contexte dans le groupe : with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): âŠ
- L'information sur la localisation des erreurs liĂ©es aux accolades non fermĂ©es et aux guillemets dans les littĂ©raux de chaĂźne a Ă©tĂ© amĂ©liorĂ©e. Par exemple, en cas d'accolade non fermĂ©e, au lieu de signaler une erreur de syntaxe dans la construction suivante, le pointeur met dĂ©sormais en surbrillance l'accolade ouvrante et indique qu'il manque un bloc de fermeture. File «example.py», line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: â{â n'a jamais Ă©tĂ© fermĂ©
Des messages d'erreur de syntaxe supplĂ©mentaires ont Ă©tĂ© ajoutĂ©s : absence du caractĂšre « : » avant un bloc et dans les dictionnaires, absence de parenthĂšses pour le tuple, absence de virgule dans les listes, spĂ©cification du bloc « try » sans « except » et « finally », utilisation de « = » au lieu de « == » dans les comparaisons, mention de *-expressions dans les f-strings. De plus, il est maintenant possible de mettre en Ă©vidence toute l'expression problĂ©matique plutĂŽt que seulement son dĂ©but, ainsi qu'une information plus explicite sur le contexte des erreurs liĂ©es Ă une mauvaise indentation. >>> def foo(): ⊠if lel: ⊠x = 2 File « », line 3 x = 2 ^ IndentationError: expected an indented block after âifâ statement in line 2
Pour les erreurs causĂ©es par des fautes de frappe dans les noms d'attributs et de variables dans une fonction, une recommandation avec le bon nom est dĂ©sormais affichĂ©e. >>> collections.namedtoplo Traceback (most recent call last): File « », line 1, in AttributeError: module âcollectionsâ has no attribute ânamedtoploâ. Did you mean: namedtuple?
- Pour les outils de débogage et les profileurs, la possibilité d'indiquer dans les événements de suivi les numéros de ligne exacts du code exécuté a été ajoutée.
- Un paramĂštre sys.flags.warn_default_encoding a Ă©tĂ© ajoutĂ© pour afficher un avertissement concernant les erreurs potentielles liĂ©es au traitement dans TextIOWrapper et open() des fichiers en UTF-8 sans spĂ©cification explicite de l'option âencoding="utf-8"â (l'encodage ASCII est utilisĂ© par dĂ©faut). De plus, la nouvelle version permet de spĂ©cifier la valeur âencoding="locale"â pour dĂ©finir l'encodage en fonction de la locale actuelle.
- Dans le module typing, qui fournit des outils pour les annotations de types, un nouvel opérateur a été ajouté, permettant d'utiliser la syntaxe « X | Y » pour choisir l'un des types (type X ou type Y). def square(number: int | float) -> int | float: return number ** 2 équivalent à la construction précédemment prise en charge : def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Le module typing a ajoutĂ© l'opĂ©rateur Concatenate et la variable ParamSpec, qui permettent de transmettre des informations supplĂ©mentaires pour la vĂ©rification statique des types lors de l'utilisation de Callable. Le module typing a Ă©galement ajoutĂ© des valeurs spĂ©ciales TypeGuard pour annoter les fonctions de protection des types et TypeAlias pour dĂ©finir explicitement un alias de type. StrCache: TypeAlias = âCache[str]â # un alias de type
- La fonction zip() comporte un drapeau optionnel « strict », qui, lorsqu'il est activĂ©, vĂ©rifie que les arguments parcourus ont la mĂȘme longueur. >>> list(zip((âaâ, âbâ, âcâ), (1, 2, 3), strict=True)) [(âaâ, 1), (âbâ, 2), (âcâ, 3)] >>> list(zip(range(3), [âfeeâ, âfiâ, âfoâ, âfumâ], strict=True)) Traceback (dernier appel le plus rĂ©cent) : ⊠ValueError: l'argument 2 de zip() est plus long que l'argument 1
- De nouvelles fonctions intégrées aiter() et anext() ont été proposées, qui réalisent des analogues asynchrones des fonctions iter() et next().
- Les constructeurs str(), bytes() et bytearray() fonctionnent de 30 Ă 40 % plus rapidement avec de petits objets.
- Le nombre d'opérations d'importation dans le module runpy a été réduit. La commande « python3 -m nom_du_module » s'exécute désormais en moyenne 1,4 fois plus rapidement grùce à la réduction des modules importés de 69 à 51.
- L'instruction LOAD_ATTR utilise un mécanisme de mise en cache de certains opcodes, permettant d'accélérer l'accÚs aux attributs classiques de 36 % et aux slots de 44 %.
- Lors de la compilation de Python avec l'option « âenable-optimizations », le mode « -fno-semantic-interposition » est dĂ©sormais activĂ©, ce qui permet d'accĂ©lĂ©rer l'interprĂ©teur jusqu'Ă 30 % par rapport Ă la compilation avec l'option « âenable-shared ».
- Dans les modules hashlib et ssl la prise en charge d'OpenSSL 3.0.0 a été ajoutée et la prise en charge des versions OpenSSL antérieures à 1.1.1 a été interrompue.
- L'ancien analyseur a été supprimé, remplacé par l'analyseur PEG (Parsing Expression Grammar) introduit dans la version précédente. Le module formatter a été retiré. Le paramÚtre loop a été supprimé de l'API asyncio. Les méthodes précédemment déclarées obsolÚtes ont été supprimées. Les fonctions Py_UNICODE_str* qui manipulaient les chaßnes Py_UNICODE* ont été supprimées.
- Le module distutils a été déclaré obsolÚte et est prévu pour suppression dans Python 3.12. Il est recommandé d'utiliser les modules setuptools, packaging, platform, shutil, subprocess et sysconfig à la place de distutils. La structure wstr dans PyUnicodeObject a également été classée parmi les éléments obsolÚtes et prévus pour suppression.
Source : opennet.ru
