Die Veröffentlichung der Programmiersprache Python 3.9

Nach einem Jahr Entwicklung vorgestellt Wesentliche Veröffentlichung der Programmiersprache Python 3.9. Python 3.9 war die erste Veröffentlichung nach Übergang dem Projekt an einem neuen Zyklus der Vorbereitung und UnterstĂŒtzung von Releases. Neue wesentliche Veröffentlichungen werden nun jĂ€hrlich erstellt, und Korrekturupdates werden alle zwei Monate herausgegeben. Jede wesentliche Version wird anderthalb Jahre unterstĂŒtzt, danach werden fĂŒr sie ĂŒber einen Zeitraum von dreieinhalb Jahren weiterhin Sicherheitskorrekturen bereitgestellt.

Die Arbeit an der neuen Version beginnt nun fĂŒnf Monate vor der Veröffentlichung der nĂ€chsten Version, d.h. gleichzeitig mit der Veröffentlichung von Python 3.9 begann Alpha-Tests der Version Python 3.10. Die Version Python 3.10 wird sieben Monate lang in der Alpha-Veröffentlichungsphase sein, wĂ€hrend dieser Zeit werden neue Funktionen hinzugefĂŒgt und Fehler behoben. Danach wird wĂ€hrend der drei Monate Beta-Testphase das HinzufĂŒgen neuer Funktionen verboten, und die gesamte Aufmerksamkeit wird der Fehlerbehebung gewidmet. Die letzten zwei Monate vor der Veröffentlichung wird die Version in der Release-Kandidaten-Phase sein, in der das finale Stabilisieren durchgefĂŒhrt wird.

Unter hinzugefĂŒgt Neuheiten in Python 3.9:

  • In Dictionaries, die mit der eingebauten Klasse dict definiert sind, ein werden die Merge-Operatoren „|“ und Update-Operatoren „|=“ unterstĂŒtzt, die die Methoden {**d1, **d2} und dict.update ergĂ€nzen, die zuvor zum ZusammenfĂŒhren von Dictionaries angeboten wurden.

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}

    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}

    >>> y | x
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

  • Die integrierte Sammlung von Typen umfasst list, dict und tuple, die als Basis-Typen ohne Import aus dem Modul typing verwendet werden können. D.h. anstelle von typing.List, typing.Dict und typing.Tuple kann jetzt einfach
    list, dict und tuple angegeben werden:

    def greet_all(names: list[str]) -> None:
    for name in names:
    print("Hello", name)

  • Es wurden flexible Mittel zur Annotierung von Funktionen und Variablen bereitgestellt. Um Annotationen anzuhĂ€ngen, wurde im Modul typing der neue Typ Annotated hinzugefĂŒgt, der bestehende Typen mit zusĂ€tzlichen Metadaten erweitert, die bei der statischen Analyse oder fĂŒr Optimierungen zur Laufzeit genutzt werden können. Um auf die Metadaten aus dem Code zuzugreifen, wurde der Methode typing.get_type_hints() ein Parameter include_extras hinzugefĂŒgt.

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

  • AbgeschwĂ€cht Die grammatikalischen Anforderungen an Dekoratoren — jeder Ausdruck, der in if- und while-Blöcken verwendet werden kann, kann jetzt als Dekorator verwendet werden. Diese Änderung hat die Lesbarkeit des PyQt5-Codes erheblich verbessert und die Wartung dieses Moduls vereinfacht:

    FrĂŒher:
    button_0 = buttons[0]
    @button_0.clicked.connect

    Jetzt kann man schreiben:
    @buttons[0].clicked.connect

  • In die Standardbibliothek wurde hinzugefĂŒgt Modul zoneinfo, einschließlich Informationen aus der IANA-Zeitzonen-Datenbank.

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Sommerzeit
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Standardzeit
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • Das Modul graphlib wurde hinzugefĂŒgt, das wurde UnterstĂŒtzung fĂŒr die topologische Sortierung von Graphen bietet.
  • Es wurden neue Methoden zum Entfernen von PrĂ€fixen und Suffixen von Zeichenfolgen vorgeschlagen — str.removeprefix(prefix) und str.removesuffix(suffix). Die Methoden wurden zu den Objekten str, bytes, bytearray und collections.UserString hinzugefĂŒgt.

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

  • wurde aktiviert neuer Parser PEG (Parsing Expression Grammar), der den LL(1)-Parser ersetzt hat. Die Anwendung des neuen Parsers hat es ermöglicht, einige "Hacks", die verwendet wurden, um die EinschrĂ€nkungen in LL(1) zu umgehen, loszuwerden und die Wartungsaufwendungen fĂŒr den Parser erheblich zu reduzieren. In Bezug auf die Leistung liegt der neue Parser etwa auf dem gleichen Niveau wie der vorherige, ĂŒbertrifft ihn jedoch erheblich in Bezug auf die FlexibilitĂ€t, was bei der Gestaltung neuer Sprachfunktionen mehr Freiheit ermöglicht. Der Code des alten Parsers bleibt vorerst erhalten und kann mit dem Flag "-X oldparser" oder der Umgebungsvariable "PYTHONOLDPARSER=1" wiederhergestellt werden, wird jedoch in der Version 3.10 entfernt.die Möglichkeit fĂŒr C-Erweiterungsmethoden, auf den Zustand der Module, in denen sie definiert sind, ĂŒber direktes Dereferenzieren von Zeigern zuzugreifen, anstatt den Zustand des Moduls mithilfe der Funktion PyState_FindModule zu suchen. Diese Änderung ermöglicht eine Leistungssteigerung der C-Module durch Verringerung oder vollstĂ€ndige Beseitigung der Overheadkosten fĂŒr die ÜberprĂŒfung des Modulzustands. Um ein Modul mit einer Klasse zu verknĂŒpfen, wurde die C-Funktion PyType_FromModuleAndSpec() vorgeschlagen, um das Modul und seinen Zustand zu erhalten, die C-Funktionen PyType_GetModule() und PyType_GetModuleState(), und um einer Methode den Zugriff auf die Klasse, in der sie definiert ist, zu ermöglichen, die C-Funktion PyCMethod und das Flag METH_METHOD.
  • Bereitgestellt Der Garbage Collector
  • Garbage Collector von ununterbrochenen Case-AusdrĂŒcken in Switch-Anweisungen befreit (ohne Return oder Break nach jedem Case-Block). Es mĂŒssen noch 32 von 2311 FĂ€llen mit dieser Art der Nutzung von Switch korrigiert werden, nach denen im Kernel-Build der Modus „-Wimplicit-fallthrough“ angewendet werden kann; von der Sperrung von Sammlungen, die wiederbelebte Objekte enthalten, die nach dem Start des Finalisierers von außen zugĂ€nglich bleiben.
  • Eine Methode wurde hinzugefĂŒgt, os.pidfd_open, der es ermöglicht, die Linux-Kernel-Subsystem "pidfd" zur Behandlung von Situationen der PID-Wiederverwendung zu nutzen (pidfd ist mit einem bestimmten Prozess verbunden und Ă€ndert sich nicht, wĂ€hrend die PID nach Abschluss des aktuellen Prozesses an einen anderen Prozess gebunden werden kann, der mit dieser PID verbunden ist).
  • Die UnterstĂŒtzung der Unicode-Spezifikation wurde auf Version 13.0.0 aktualisiert.
  • Beseitigt Speicherleck bei der erneuten Initialisierung des Python-Interpreters in einem Prozess.
  • Die Leistung der eingebauten Typen range, tuple, set, frozenset, list und dict wurde optimiert, realisierte durch die Anwendung des Vectorcall-Protokolls fĂŒr einen schnelleren Zugriff auf in C geschriebene Objekte.
  • Die Module _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time und _weakref wurden zur initialen Ladezeit mit mehrstufiger Initialisierung.
  • Die Module der Standardbibliothek audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios und zlib wurden so umgestellt, dass sie ein begrenztes stabiles ABI, das die Problematik der FunktionalitĂ€t von Erweiterungsmodulen fĂŒr verschiedene Python-Versionen löst (bei einem Versionsupdate sind keine neuen Compilierungen von Erweiterungsmodulen erforderlich, und fĂŒr 3.9 gebaute Module können in der Version 3.10 verwendet werden).
  • Im asyncio-Modul wurde die UnterstĂŒtzung der Option reuse_address aufgrund potenzieller Sicherheitsprobleme eingestellt (die Verwendung von SO_REUSEADDR fĂŒr UDP in Linux ermöglicht es verschiedenen Prozessen, hörende Sockets an einen UDP-Port anzuhĂ€ngen).
  • Es wurden neue Optimierungen hinzugefĂŒgt, zum Beispiel die Leistung von Signalhandlern in Multithread-Anwendungen wurde verbessert, die Geschwindigkeit des subprocess-Moduls in der FreeBSD-Umgebung erhöht und die Zuweisung von Zeitvariablen beschleunigt (die Zuordnung einer Variablen im Ausdruck „for y in [expr]“ ist jetzt nicht langsamer als der Ausdruck „y = expr“). Insgesamt ist die Mehrheit der Tests zeigen geringerer Performance im Vergleich zum Branch 3.8 (Verbesserungen sind nur in den Tests write_local und write_deque zu beobachten):

    Python-Version 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Zugriff auf Variablen und Attribute:
    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
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Zugriff auf Variablen und Attribute:
    write_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
    write_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

    Zugriff auf Datenstrukturen:
    read_list 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

    Zugriff zum Schreiben in Datenstrukturen:
    write_list 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

    Stapel- (oder Warteschlangen-) Operationen:
    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

    Zeitmessung des Schleifen:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Entfernt viele Funktionen und Methoden von Python 2.7, die zuvor als veraltet gekennzeichnet waren und in der letzten Ausgabe zu einer DeprecationWarning fĂŒhrten, einschließlich der Methode unescape() in html.parser.HTMLParser,
    tostring() und fromstring() in array.array, isAlive() in threading.Thread, getchildren() und getiterator() in ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() und base64.decodestring().

Quelle: opennet.ru

60GB SSD 8Gb DDR4