Nach einem Jahr Entwicklung Wesentliche Veröffentlichung der Programmiersprache . Python 3.9 war die erste Veröffentlichung nach dem Projekt an 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 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.
in Python 3.9:
- In Dictionaries, die mit der eingebauten Klasse dict definiert sind, 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) - 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')] - 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.connectJetzt kann man schreiben:
@buttons[0].clicked.connect - In die Standardbibliothek Modul , 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 Unterstützung für die topologische Sortierung von Graphen bietet.
- 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' - neuer Parser (Parsing Expression Grammar), der den LL(1)-Parser ersetzt hat. 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.
- Der Garbage Collector
- Garbage Collector 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, , 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 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-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 .
- Die Module der Standardbibliothek audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios und zlib wurden so umgestellt, dass sie ein begrenztes , 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 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.9Zugriff 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.7Zugriff 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.6Zugriff 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.8Stapel- (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.5Zeitmessung des Schleifen:
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 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
