Veröffentlichung der Programmiersprache Python 3.9

Nach einem Jahr Entwicklung wurde vorgestellt bedeutende Veröffentlichung der Programmiersprache Python 3.9. Python 3.9 war die erste Veröffentlichung nach des Wechsels dem Projekt ĂŒber einen neuen Zyklus der Vorbereitung und Betreuung von Releases. Bedeutende Veröffentlichungen werden nun einmal jĂ€hrlich erstellt, und Wartungsupdates erscheinen alle zwei Monate. Jede bedeutende Version wird eineinhalb Jahre lang unterstĂŒtzt, anschließend werden fĂŒr sie noch dreieinhalb Jahre lang Sicherheitsupdates bereitgestellt.

Die Arbeit an einem neuen Branch beginnt nun fĂŒnf Monate vor der Veröffentlichung des nĂ€chsten Branches, d.h. gleichzeitig mit dem Release von Python 3.9 Es begann Alpha-Tests fĂŒr den Branch Python 3.10. Der Branch Python 3.10 wird sich fĂŒr sieben Monate in der Alpha-Version befinden, wĂ€hrend dieser Zeit werden neue Funktionen hinzugefĂŒgt und Fehler behoben. Anschließend wird es drei Monate lang Beta-Tests geben, in denen das HinzufĂŒgen neuer Funktionen verboten ist und der gesamte Fokus auf der Fehlerbehebung liegt. Die letzten zwei Monate vor der Veröffentlichung wird der Branch sich im Release-Kandidaten-Status befinden, in dem die finale Stabilisierung durchgefĂŒhrt wird.

Unter hinzugefĂŒgt Neuheiten in Python 3.9:

  • In Dictionaries, die mit der eingebauten Klasse dict definiert sind, wurde eingefĂŒhrt UnterstĂŒtzung der Merge-Operatoren „|“ und Update-Operatoren „|=“, 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 eingebaute Typensammlung umfasst list, dict und tuple, die als Basisdatenarten ohne Import aus dem Modul typing verwendet werden können. Das heißt, anstelle von typing.List, typing.Dict und typing.Tuple können 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 AnnotationsfunktionalitĂ€t und Variablen bereitgestellt. Um Anmerkungen hinzuzufĂŒgen, wurde in das Modul typing ein neuer Typ Annotated eingefĂŒhrt, der bestehende Typen um zusĂ€tzliche Metadaten erweitert, die bei der statischen Analyse oder zur Optimierung zur Laufzeit verwendet werden können. Um auf die Metadaten aus dem Code zuzugreifen, wurde dem Methodentyp typing.get_type_hints() ein Parameter include_extras hinzugefĂŒgt.

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

  • Abgemildert Die grammatikalischen Anforderungen an Dekoratoren – jede AusdrĂŒcke, die geeignet sind fĂŒr die Verwendung in if- und while-Blöcken, können jetzt als Dekorator verwendet werden. Diese Änderung hat die Lesbarkeit des PyQt5-Codes erheblich verbessert und die Wartung dieses Moduls vereinfacht:

    War:
    button_0 = buttons[0]
    @button_0.clicked.connect

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

  • In die Standardbibliothek ein Modul zoneinfo, die Informationen aus der IANA-Zeitzonendatenbank enthĂ€lt.

    >>> 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, in dem wurde die UnterstĂŒtzung fĂŒr topologische Sortierung von Graphen enthalten ist.
  • 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'

  • Ein neuer Parser wurde aktiviert (Parsing Expression Grammar), der den Parser PEG LL(1) ersetzt hat. LL(1). Die EinfĂŒhrung des neuen Parsers hat es ermöglicht, einige „Hacks“ zum Umgehen der EinschrĂ€nkungen in LL(1) zu beseitigen und die Wartungskosten des Parsers erheblich zu senken. In Bezug auf die Leistung liegt der neue Parser ungefĂ€hr auf dem gleichen Niveau wie der alte, ĂŒbertrifft ihn jedoch deutlich bei der FlexibilitĂ€t, was ein freieres Design neuer Sprachfunktionen erlaubt. 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.
  • Es wurde Die Möglichkeit fĂŒr C-Extensions, auf den Zustand der Module zuzugreifen, in denen sie definiert sind, unter Verwendung der direkten Dereferenzierung von Zeigern anstelle der Suche nach dem Modulzustand ĂŒber die Funktion PyState_FindModule. Diese Änderung verbessert die Leistung von C-Modulen, indem die Overheads fĂŒr die ÜberprĂŒfung des Modulzustands verringert oder vollstĂ€ndig ausgeschlossen werden. Eine C-Funktion namens PyType_FromModuleAndSpec() wird vorgeschlagen, um ein Modul mit einer Klasse zu assoziieren, wĂ€hrend die C-Funktionen PyType_GetModule() und PyType_GetModuleState() genutzt werden können, um das Modul und seinen Zustand abzurufen. Die C-Funktion PyCMethod und das Flag METH_METHOD ermöglichen den Zugriff auf die Klasse, in der die Methode definiert ist.
  • Garbage Collector von nicht unterbrochenen case-AusdrĂŒcken in switch von der Sperrung von Sammlungen, die reanimierte Objekte enthalten, die nach dem AusfĂŒhren des Finalizers weiterhin von außen zugĂ€nglich sind.
  • Es wurde die Methode os.pidfd_open, was die Verwendung des „pidfd“-Kernelsubsystems von Linux ermöglicht, um mit der Situation des Wiederverwendens von PIDs umzugehen (pidfd ist an einen bestimmten Prozess gebunden und Ă€ndert sich nicht, wĂ€hrend der PID nach Abschluss des aktuellen Prozesses, der mit diesem PID assoziiert ist, an einen anderen Prozess gebunden werden kann).
  • Die UnterstĂŒtzung der Unicode-Spezifikation wurde auf Version 13.0.0 aktualisiert.
  • Beheben 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, verwirklicht durch die Anwendung des Vectorcall-Schnellaufrufprotokolls fĂŒr einen schnelleren Zugriff auf in C geschriebenen Objekte.
  • Die Module _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time und _weakref wurden auf ein mehrstufiges Laden umgestellt mit.
  • Die Module der Standardbibliothek audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios und zlib wurden auf die Verwendung eines eingeschrĂ€nkten stabilen ABI, der das Problem der FunktionsfĂ€higkeit von Erweiterungsmodul-Bauten fĂŒr verschiedene Python-Versionen löst (bei Aktualisierungen ist kein Neukompilieren der Erweiterungsmodule erforderlich, und Module, die fĂŒr 3.9 gebaut wurden, können in der Version 3.10 verwendet werden).
  • Im asyncio-Modul wurde aufgrund potenzieller Sicherheitsprobleme die UnterstĂŒtzung des Parameters reuse_address eingestellt (die Verwendung von SO_REUSEADDR fĂŒr UDP unter Linux ermöglicht es verschiedenen Prozessen, Listener-Sockets an einen UDP-Port anzuhĂ€ngen).
  • Neue Optimierungen wurden hinzugefĂŒgt, wie zum Beispiel die verbesserte Leistung von Signalverarbeitern in multithreaded Anwendungen, die erhöhte Geschwindigkeit des subprocess-Moduls in der FreeBSD-Umgebung und die beschleunigte Zuweisung temporĂ€rer Variablen (die Zuweisung einer Variablen im Ausdruck „for y in [expr]“ ist nun auf gleicher Leistungsstufe wie der Ausdruck „y = expr“). Insgesamt zeigen die meisten Tests zeigen Ein RĂŒckgang der Leistung im Vergleich zu Version 3.8 (Beschleunigungen wurden nur in den Tests write_local und write_deque beobachtet):

    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 das Schreiben von Variablen und Attributen:
    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 Datenstruktur:
    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

    Schreiben auf Datenstruktur:
    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

    Stack- (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

    Timing-Schleife:
    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 markiert wurden und im letzten Release 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

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster