Sortie du langage de programmation Python 3.9

Après un an de développement soumis version importante du langage de programmation Python 3.9. Python 3.9 était la première version après transition projet sur nouveau cycle préparation et support des releases. De nouvelles versions majeures seront désormais générées une fois par an et des mises à jour correctives seront publiées tous les deux mois. Chaque branche importante sera prise en charge pendant un an et demi, après quoi trois ans et demi supplémentaires seront développés pour corriger les vulnérabilités.

Le travail sur une nouvelle branche commence désormais cinq mois avant la sortie de la branche suivante, c'est-à-dire coïncidant avec la sortie de Python 3.9 commencé test alpha de la branche Python 3.10. La branche Python 3.10 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. Les deux derniers mois avant la sortie, la branche sera au stade de la release candidate, au cours de laquelle la stabilisation finale sera effectuée.

parmi ajoutée nouveautés en Python 3.9 :

  • Dans les dictionnaires définis à l'aide de la classe dict intégrée, apparu prise en charge des opérateurs de fusion "|" et "|=" mises à jour, qui complètent les méthodes {**d1, **d2} et dict.update précédemment proposées pour la fusion de dictionnaires.

    >>> x = {"key1": "valeur1 de x", "key2": "valeur2 de x"}
    >>> y = {"key2": "valeur2 de y", "key3": "valeur3 de y"}

    >>> x | oui
    {'key1' : 'valeur1 de x', 'key2' : 'valeur2 de y', 'key3' : 'valeur3 de y'}

    >>> et | X
    {'key2' : 'valeur2 de x', 'key3' : 'valeur3 de y', 'key1' : 'valeur1 de x'}

  • La collection de types intégrée comprend des listes, des dicts et des tuples, qui peuvent être utilisés comme types de base sans importer depuis le module de saisie. Ceux. au lieu de taper.List, typing.Dict et typing.Tuple, vous pouvez maintenant spécifier
    il suffit de lister, dicter et tuple :

    def greet_all(names : list[str]) -> Aucun :
    pour le nom dans les noms :
    print("Bonjour", nom)

  • Sont prévus outils flexibles pour annoter des fonctions et des variables. Pour attacher des annotations, un nouveau type Annoté a été ajouté au module de saisie, étendant les types existants avec des métadonnées supplémentaires qui peuvent être utilisées pour l'analyse statique ou pour les optimisations d'exécution. Pour accéder aux métadonnées à partir du code, le paramètre include_extras a été ajouté à la méthode typing.get_type_hints().

    charType = Annoté[int, ctype("char")] UnsignedShort = Annoté[int, struct2.ctype('H')]

  • Atténué exigences grammaticales pour les décorateurs - toute expression pouvant être utilisée dans les blocs if et while peut désormais être utilisée comme décorateur. Le changement a considérablement amélioré la lisibilité du code PyQt5 et simplifié la maintenance de ce module :

    C'était:
    bouton_0 = boutons[0] @bouton_0.clicked.connect

    Maintenant, vous pouvez écrire :
    @buttons[0].clicked.connect

  • Vers la bibliothèque standard ajoutée module infozone, qui inclut des informations provenant de la base de données de fuseau horaire de l'IANA.

    >>> depuis zoneinfo importer ZoneInfo
    >>> à partir de datetime importation datetime, timedelta
    >>> # Heure d'été
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Amérique/Los_Angeles"))
    >>> imprimer(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Heure normale
    >>> dt += timedelta(jours=7)
    >>> imprimer(dt)
    2020-11-07 12:00:00-08:00

    >>> imprimer(dt.tzname())
    PST

  • Ajout du module graphlib, dans lequel mis en œuvre prise en charge du tri topologique des graphiques.
  • Proposé nouvelles méthodes pour supprimer les préfixes et les fins de ligne - str.removeprefix(prefix) et str.removesuffix(suffix). Des méthodes ont été ajoutées aux objets str, bytes, bytearray et collections.UserString.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'Bar'

  • Impliqué nouvel analyseur PEG (Parsing Expression Grammar), qui a remplacé l'analyseur LL(1). L'utilisation du nouvel analyseur a permis de se débarrasser de certains « hacks » utilisés pour contourner les restrictions de LL(1), et a considérablement réduit les coûts de main d'œuvre pour la maintenance de l'analyseur. En termes de performances, le nouvel analyseur est à peu près au même niveau que le précédent, mais il est nettement en avance en termes de flexibilité, ce qui permet de se sentir plus libre lors de la conception de nouvelles fonctionnalités du langage. L'ancien code de l'analyseur est conservé pour l'instant et peut être renvoyé à l'aide de l'indicateur "-X oldparser" ou de la variable d'environnement "PYTHONOLDPARSER=1", mais sera supprimé dans la version 3.10.
  • Fourni par la possibilité pour les méthodes d'extension C d'accéder à l'état des modules dans lesquels elles sont définies en utilisant le déréférencement direct du pointeur au lieu de rechercher l'état du module à l'aide de la fonction PyState_FindModule. Le changement vous permet d'augmenter les performances des modules C en réduisant ou en éliminant complètement la surcharge liée à la vérification de l'état du module. Pour associer un module à une classe, la fonction C PyType_FromModuleAndSpec() est proposée, pour obtenir le module et son état, les fonctions C PyType_GetModule() et PyType_GetModuleState() sont proposées, et pour fournir une méthode avec accès à la classe dans lequel il est défini, la fonction C PyCMethod et le flag METH_METHOD sont proposés.
  • Éboueur livré du verrouillage des collections contenant des objets réanimés qui restent accessibles de l'extérieur après l'exécution du finaliseur.
  • Méthode ajoutée os.pidfd_open, qui permet au sous-système du noyau Linux "pidfd" d'être utilisé pour gérer la situation de réutilisation du PID (pidfd est associé à un processus spécifique et ne change pas, tandis qu'un PID peut être associé à un autre processus après la fin du processus actuel associé à ce PID ).
  • La prise en charge de la spécification Unicode a été mise à jour vers la version 13.0.0.
  • Éliminé fuite de mémoire lors de la réinitialisation de l'interpréteur Python dans le même processus.
  • Les performances des types intégrés range, tuple, set, Frozenset, list et dict ont été optimisées. mis en œuvre grâce à l'utilisation du protocole de raccourci Vectorcall pour un accès plus rapide aux objets écrits en langage C.
  • Les modules _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, Operator, Resource, Time et _weakref ont été déplacés vers le chargement depuis initialisation en plusieurs étapes.
  • Les modules de bibliothèque standard audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios et zlib ont été convertis pour une utilisation restreinte. IBC stable, qui résout le problème de l'opérabilité des assemblages de modules d'extension pour différentes versions de Python (lors de la mise à jour de la version, il n'est pas nécessaire de reconstruire les modules d'extension, et les modules compilés pour 3.9 pourront fonctionner dans la branche 3.10).
  • Le module asyncio a obsolète la prise en charge du paramètre reuse_address en raison de problèmes de sécurité potentiels (l'utilisation de SO_REUSEADDR pour UDP sous Linux permet à différents processus d'attacher des sockets d'écoute à un port UDP).
  • De nouvelles optimisations ont été ajoutées, par exemple, des performances améliorées des gestionnaires de signaux dans les applications multithread, une vitesse accrue du module de sous-processus dans l'environnement FreeBSD et une affectation plus rapide des variables temporaires (attribution d'une variable dans l'expression « pour y dans [expr ]” est désormais aussi performante que l’expression “y = expr” "). En général, la plupart des tests montrer diminution des performances par rapport à la branche 3.8 (l'accélération n'est observée que dans les tests write_local et write_deque) :

    Python version 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Accès en lecture aux variables et aux attributs :
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 ​​45.0 46.8 18.4 23.2
    méthode read_bound 37.6 37.9 29.6 26.9 27.7 45.9

    Accès en écriture aux variables et aux attributs :
    écrire_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    écrire_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Accès en lecture à la structure des données :
    liste_lis 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    read_dict 24.3 25.7 22.3 23.0 21.0 22.5
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Accès en écriture à la structure de données :
    liste_écriture 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    write_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Opérations de pile (ou de file d'attente) :
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Boucle de synchronisation :
    boucle_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Supprimé de nombreuses fonctions et méthodes Python 2.7 qui étaient auparavant obsolètes et entraînaient un DeprecationWarning dans la version précédente, y compris la méthode unescape() dans html.parser.HTMLParser,
    tostring() et fromstring() dans array.array, isAlive() dans threading.Thread, getchildren() et getiterator() dans ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() et base64.decodestring().

Source: opennet.ru

Ajouter un commentaire