Sortie du langage de programmation Python 3.10

Après un an de développement, la version significative du langage de programmation Python 3.10 est présentée. La nouvelle branche sera prise en charge pendant un an et demi, après quoi pendant trois ans et demi supplémentaires, des correctifs seront générés pour éliminer les vulnérabilités.

Parallèlement, les tests alpha de la branche Python 3.11 ont commencé (conformément au nouveau calendrier de développement, les travaux sur une nouvelle branche commencent cinq mois avant la sortie de la branche précédente et atteignent le stade des tests alpha au moment de la prochaine version ). La branche Python 3.11 sera en version alpha pendant sept mois, durant lesquels de nouvelles fonctionnalités seront ajoutées et des bugs corrigés. Après cela, les versions bêta seront testées pendant trois mois, pendant lesquels l'ajout de nouvelles fonctionnalités sera interdit et toute l'attention sera portée à la correction des bugs. Au cours des deux derniers mois précédant la sortie, la branche sera au stade de la release candidate, au cours de laquelle la stabilisation finale sera effectuée.

Les nouveaux ajouts à Python 3.10 incluent :

  • Implémentation des opérateurs « match » et « case » pour la correspondance de modèles, qui améliorent la lisibilité du code, simplifient la correspondance d'objets Python arbitraires et augmentent la fiabilité du code grâce à une vérification de type statique avancée. L'implémentation ressemble beaucoup à l'opérateur « match » fourni dans Scala, Rust et F#, qui compare le résultat d'une expression spécifiée avec une liste de modèles répertoriés dans des blocs basés sur l'opérateur « case ».

    def http_error(status) : statut de correspondance : cas 400 : renvoie « Mauvaise demande » cas 401|403|404 : renvoie « Non autorisé » cas 418 : renvoie « Je suis une théière » cas _ : renvoie « Quelque chose d'autre »

    Vous pouvez décompresser des objets, des tuples, des listes et des séquences arbitraires pour lier des variables en fonction de valeurs existantes. Il est permis de définir des modèles imbriqués, d'utiliser des conditions « if » supplémentaires dans le modèle, d'utiliser des masques (« [x, y, *rest] »), des mappages clé/valeur (par exemple, {« bande passante » : b, « latence » ”: l} pour extraire les valeurs de « bande passante » et de « latence » d'un dictionnaire), extraire des sous-modèles (opérateur :="), utiliser des constantes nommées dans un modèle. Dans les classes, il est possible de personnaliser le comportement de correspondance à l'aide de la méthode « __match__() ».

    à partir des classes de données import dataclass @dataclass class Point : x : int y : int def où est (point) : point de correspondance : case Point (0, 0) : print ("Origin") case Point (0, y): print (f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Ailleurs") case _: print("Pas un point") match point: case Point(x, y) if x == y: print(f"Y=X at {x}") case Point(x, y): print(f"Pas sur la diagonale") ROUGE, VERT, BLEU = 0, 1, 2 correspondre à la couleur : case ROUGE : imprimer ("Je vois du rouge !") case VERT : imprimer ("L'herbe est verte") case BLEU : imprimer ("Je ressens le blues :(")

  • Il est désormais possible d'utiliser des parenthèses dans l'instruction with pour diviser la définition d'une collection de gestionnaires de contexte sur plusieurs lignes. Il est également permis de laisser une virgule après le gestionnaire de contexte final du groupe : avec ( CtxManager1() comme exemple1, CtxManager2() comme exemple2, CtxManager3() comme exemple3, ) : ...
  • Amélioration du rapport sur l'emplacement du code des erreurs liées aux accolades et guillemets non fermés dans les chaînes littérales. Par exemple, lorsqu'il y a une accolade non fermée, au lieu de signaler une erreur de syntaxe dans la construction suivante, le pointeur met désormais en évidence l'accolade ouvrante et indique qu'il n'y a pas de bloc fermant. Fichier "exemple.py", ligne 1 attendue = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError : '{' n'a jamais été fermé

    Ajout de messages d'erreur de syntaxe spécialisés supplémentaires : symbole : manquant avant un bloc et dans les dictionnaires, ne séparant pas un tuple par des parenthèses, manquant une virgule dans les listes, spécifiant un bloc "try" sans "sauf" et "finally", en utilisant "= " au lieu de "= =" dans les comparaisons, en spécifiant les expressions * dans les f-strings. De plus, cela garantit que l'ensemble de l'expression problématique est mis en évidence, et pas seulement le début, ainsi que des informations plus explicites sur le contexte des erreurs associées à une indentation incorrecte. >>> def foo() : ... si lel : ... x = 2 Fichier " ", ligne 3 x = 2 ^ IndentationError : attendu un bloc en retrait après l'instruction 'if' à la ligne 2

    En cas d'erreurs causées par des fautes de frappe dans les noms d'attributs et de variables d'une fonction, une recommandation avec le nom correct est générée. >>>collections.namedtoplo Traceback (dernier appel le plus récent) : Fichier « ", ligne 1, dans AttributeError : le module 'collections' n'a pas d'attribut 'namedtoplo'. Vouliez-vous dire : nommétuple ?

  • Pour les outils de débogage et les profileurs, les événements de trace sont fournis avec les numéros de ligne exacts du code exécuté.
  • Ajout du paramètre sys.flags.warn_default_encoding pour afficher un avertissement sur les erreurs potentielles associées au TextIOWrapper et à open() traitant les fichiers codés en UTF-8 sans spécifier explicitement l'option 'encoding=»utf-8″' (l'encodage ASCII est utilisé par défaut) . La nouvelle version offre également la possibilité de spécifier une valeur « encoding="locale" » pour définir l'encodage en fonction des paramètres régionaux actuels.
  • Un nouvel opérateur a été ajouté au module de typage, qui fournit des outils pour spécifier des annotations de type, permettant l'utilisation de la syntaxe « X | Y" pour sélectionner l'un des types (type X ou type Y). def carré (nombre : int | float) -> int | float : return number ** 2 est équivalent à la construction précédemment prise en charge : def square(number: Union[int, float]) -> Union[int, float] : return number ** 2
  • L'opérateur Concatenate et la variable ParamSpec ont été ajoutés au module de typage, ce qui vous permet de transmettre des informations supplémentaires pour la vérification de type statique lors de l'utilisation de Callable. Le module de typage ajoute également des valeurs spéciales TypeGuard pour annoter les fonctions de protection de type et TypeAlias ​​​​pour définir explicitement un alias de type. StrCache : TypeAlias ​​​​= 'Cache[str]' # un alias de type
  • La fonction zip() implémente un indicateur « strict » facultatif qui, lorsqu'il est spécifié, vérifie si les arguments itérés 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 avoirter() et anext() sont proposées avec l'implémentation d'analogues asynchrones aux fonctions iter() et next().
  • Le travail des constructeurs str(), bytes() et bytearray() lors du travail avec de petits objets a été accéléré de 30 à 40 %.
  • Réduction du nombre d'opérations d'importation dans le module runpy. La commande "python3 -m module_name" 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 pour les opcodes individuels, ce qui a permis d'accélérer le travail avec des attributs réguliers jusqu'à 36 % et avec des slots jusqu'à 44 %.
  • Lors de la construction 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 construction avec l'option « --enable-shared ». " option.
  • Les modules hashlib et ssl ont ajouté la prise en charge d'OpenSSL 3.0.0 et ont cessé de prendre en charge les versions d'OpenSSL antérieures à 1.1.1.
  • L'ancien analyseur a été supprimé, qui a été remplacé dans la branche précédente par l'analyseur PEG (Parsing Expression Grammar). Le module formateur a été supprimé. Le paramètre loop a été supprimé de l'API asyncio. Les méthodes précédemment obsolètes ont été supprimées. Les fonctions Py_UNICODE_str* qui manipulent les chaînes Py_UNICODE* ont été supprimées.
  • Le module distutils est obsolète et sa suppression est prévue dans Python 3.12. Au lieu de distutils, il est recommandé d'utiliser les modules setuptools, packaging, platform,shutil, subprocess et sysconfig. La structure wstr dans PyUnicodeObject est obsolète et sa suppression est prévue.

Source: opennet.ru

Ajouter un commentaire