Publication du langage de programmation Python 3.11

Après une année de développement, une version majeure du langage de programmation Python 3.11 a été publiée. Cette branche sera maintenue pendant un an et demi, après quoi des correctifs de sécurité seront fournis pendant trois ans et demi.

En parallèle, le test alpha de la branche Python 3.12 a débuté (selon le nouveau calendrier de développement, le travail sur une nouvelle branche commence cinq mois avant la sortie de la branche précédente et atteint le stade de test alpha au moment de la prochaine sortie). La branche Python 3.12 sera en phase de versions alpha pendant sept mois, au cours desquels de nouvelles fonctionnalités seront ajoutées et des corrections de bogues seront effectuées. Ensuite, pendant trois mois, les versions bêta seront testées, période durant laquelle l'ajout de nouvelles fonctionnalités sera interdit et l'accent sera mis sur les corrections de bogues. Les deux derniers mois avant la sortie, la branche sera en phase de candidats à la sortie, où la stabilisation finale sera réalisée.

Parmi les nouveautés ajoutées dans Python 3.11 :

  • Un travail considérable a été réalisé pour optimiser les performances. Cette nouvelle branche inclut des modifications visant à accélérer et à déployer en ligne les appels de fonctions, à utiliser des interpréteurs rapides pour les opérations de type (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), ainsi que des optimisations préparées par les projets Cinder et HotPy. Selon la charge de travail, des gains de vitesse d'exécution du code de 10 à 60 % ont été notés. En moyenne, la performance lors de l'exécution du test pyperformance a augmenté de 25 %.

    Le mécanisme de mise en cache du bytecode a été retravaillé, permettant de réduire le temps de démarrage de l'interpréteur de 10 à 15 %. Les objets contenant du code et du bytecode sont désormais placés de manière statique par l'interpréteur, ce qui a permis d'exclure les étapes de démarchalisation du bytecode extrait du cache et de transformation des objets contenant du code pour un placement en mémoire dynamique.

  • Lors de l'affichage de la trace des appels dans les messages de diagnostic, des informations sur l'expression ayant provoqué l'erreur sont désormais fournies (auparavant, seule la ligne était mise en surbrillance sans préciser quelle partie de la ligne était à l'origine de l'erreur). Des informations détaillées sur la trace peuvent également être obtenues via l'API et utilisées pour faire correspondre des instructions individuelles de bytecode à une position spécifique dans le code source, en utilisant la méthode codeobject.co_positions() ou la fonction C API PyCode_Addr2Location(). Ce changement simplifie considérablement le débogage des problèmes liés aux objets imbriqués, aux appels de fonctions multiples et aux expressions arithmétiques complexes. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division par zéro
  • Ajout de la prise en charge des groupes d'exceptions, permettant au programme de générer et de traiter plusieurs exceptions différentes en même temps. De nouveaux types d'exceptions, ExceptionGroup et BaseExceptionGroup, ont été proposés pour regrouper plusieurs exceptions et les appeler ensemble, et l'expression «except*» a été ajoutée pour extraire des exceptions individuelles d'un groupe.
  • La classe BaseException a été dotée d'une méthode add_note(), permettant d'attacher un texte de note à l'exception, par exemple, de fournir des informations contextuelles non disponibles lors de la génération de l'exception.
  • Un type spécial Self a été ajouté, représentant la classe actuelle. Self peut être utilisé pour annoter les méthodes qui renvoient une instance de leur propre classe, de manière plus simple que l'utilisation de TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Un nouveau type LiteralString a été ajouté, qui ne peut inclure que des littéraux de chaîne compatibles avec le type LiteralString (c'est-à-dire des chaînes brutes et des chaînes de type LiteralString, mais pas des chaînes arbitraires ou combinées de type str). Le type LiteralString peut être utilisé pour limiter le passage d'arguments de chaînes à des fonctions, une substitution arbitraire de parties de chaînes pouvant mener à des vulnérabilités, par exemple lors de la formation de chaînes pour des requêtes SQL ou des commandes shell. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(«SELECT * FROM students») # ok run_query(literal_string) # ok run_query(«SELECT * FROM » + literal_string) # ok run_query(arbitrary_string) # Erreur run_query( # Erreur f»SELECT * FROM students WHERE name = {arbitrary_string}» )
  • Un nouveau type TypeVarTuple a été ajouté, permettant d'utiliser des génériques variadiques, contrairement à TypeVar qui couvre un seul type, mais un nombre arbitraire de types.
  • Le module tomllib a été inclus dans la bibliothèque standard avec des fonctions pour analyser le format TOML.
  • Il est désormais possible de marquer des éléments individuels de dictionnaires typés (TypedDict) avec des étiquettes Required et NotRequired pour définir des champs obligatoires et non obligatoires (par défaut, tous les champs déclarés sont obligatoires si le paramètre total n'est pas défini sur False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (le champ year est facultatif) m3: Movie = {«year»: 2022} # Erreur, le champ obligatoire title n'est pas rempli)
  • La classe TaskGroup a été ajoutée au module asyncio avec une implémentation de gestionnaire de contexte asynchrone, attendant l'achèvement d'un groupe de tâches. L'ajout de tâches au groupe se fait via la méthode create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«Les deux tâches sont maintenant terminées.»)
  • Un décorateur pour les classes, méthodes et fonctions @dataclass_transform a été ajouté, indiquant que le système de vérification des types statiques traite l'objet comme s'il utilisait le décorateur @dataclasses.dataclass. Dans l'exemple ci-dessous, la classe CustomerModel sera traitée lors de la vérification des types comme une classe avec le décorateur @dataclasses.dataclass, c'est-à-dire comme ayant une méthode __init__ qui accepte les variables id et name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • Les expressions régulières ont été enrichies de la possibilité d'utiliser des groupes atomiques ((?>…)) et des quantificateurs possessifs (*+, ++, ?+, {m,n}+).
  • Ajout de l'option de ligne de commande «-P» et de la variable d'environnement PYTHONSAFEPATH pour désactiver l'attachement automatique à sys.path de chemins de fichiers potentiellement non sûrs.
  • L'outil py.exe pour la plateforme Windows a été considérablement amélioré, prenant en charge la syntaxe «-V:/» en plus de «-.».
  • De nombreux macros dans l'API C ont été convertis en fonctions inline normales ou statiques.
  • Les modules uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev et sunau sont déclarés obsolètes et seront supprimés dans la version Python 3.13. Les fonctions PyUnicode_Encode* ont été supprimées.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster