Nach einem Jahr Entwicklung bedeutende Veröffentlichung der Programmiersprache . Python 3.9 war die erste Veröffentlichung nach dem Projekt über 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 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.
in Python 3.9:
- In Dictionaries, die mit der eingebauten Klasse dict definiert sind, 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) - 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')] - 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.connectJetzt kann man schreiben:
@buttons[0].clicked.connect - In die Standardbibliothek Modul , 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 die Unterstützung für topologische Sortierung von Graphen enthalten ist.
- 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' - (Parsing Expression Grammar), der den Parser LL(1) ersetzt hat. . 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.
- 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 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 , 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 bei der erneuten Initialisierung des Python-Interpreters in einem Prozess.
- Die Leistung der eingebauten Typen range, tuple, set, frozenset, list und dict wurde optimiert, 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 .
- Die Module der Standardbibliothek audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios und zlib wurden auf die Verwendung eines eingeschränkten , 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 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.9Zugriff 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.7Zugriff 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.6Schreiben 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.8Stack- (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.5Timing-Schleife:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - 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
