Nach einem Jahr der Entwicklung wurde eine bedeutende Version der Programmiersprache Python 3.11 veröffentlicht. Der neue Branch wird eineinhalb Jahre lang unterstützt, gefolgt von weiteren dreieinhalb Jahren, in denen Fehlerbehebungen zur Schließung von Sicherheitslücken bereitgestellt werden.
Gleichzeitig begann die Alpha-Tests von Python 3.12 (gemäß dem neuen Entwicklungszeitplan startet die Arbeit an einem neuen Branch fünf Monate vor der Veröffentlichung des vorherigen Branches und erreicht zum Zeitpunkt der nächsten Veröffentlichung die Alpha-Testphase). Der Branch Python 3.12 wird sieben Monate lang in der Alpha-Version bleiben, während dieser Zeit werden neue Funktionen hinzugefügt und Fehlerbehebungen vorgenommen. Danach wird es drei Monate lang Beta-Tests geben, in denen das Hinzufügen neuer Funktionen nicht gestattet ist und der Fokus auf der Behebung von Fehlern liegt. Die letzten zwei Monate vor der Veröffentlichung wird der Branch in der Release-Kandidat-Phase sein, in der die finale Stabilisierung durchgeführt wird.
Zu den Neuerungen in Python 3.11 gehören:
- Es wurde erhebliche Arbeit in der Leistungsoptimierung geleistet. Die neue Version enthält Änderungen zur Beschleunigung und Inline-Bereitstellung von Funktionsaufrufen sowie den Einsatz schneller Interpreter für grundlegende Operationen (x+x, x*x, x-x, a[i], a[i] = z, f(arg), C(arg), o.method(), o.attr = z, *seq). Außerdem wurden Optimierungen durch die Projekte Cinder und HotPy bereitgestellt. Je nach Art der Belastung wurde eine Geschwindigkeitssteigerung der Code-Ausführung von 10-60% festgestellt. Im Durchschnitt hat sich die Leistung beim Durchlauf des Testsets pyperformance um 25% erhöht.
Der Mechanismus zur Zwischenspeicherung von Bytecode wurde überarbeitet, was die Startzeit des Interpreters um 10-15% verkürzt hat. Objekte mit Code und Bytecode werden nun statisch vom Interpreter angeordnet, was es ermöglicht, die Phasen des Demarshallings des aus dem Cache entnommenen Bytecodes und der Umwandlung von Objekten mit Code für die Platzierung im dynamischen Speicher zu eliminieren.
- Bei der Anzeige von Rückverfolgungen in Diagnosenachrichten wird nun auch die Information über den Ausdruck angezeigt, der den Fehler verursacht hat (früher wurde nur die Zeile ohne Details hervorgehoben, welcher Teil der Zeile den Fehler verursacht hat). Erweiterte Informationen zur Rückverfolgung können ebenfalls über die API abgerufen und verwendet werden, um einzelne Bytecode-Instruktionen mit einer bestimmten Position im Quellcode abzugleichen, indem die Methode codeobject.co_positions() oder die C API-Funktion PyCode_Addr2Location() verwendet wird. Diese Änderung erleichtert erheblich die Fehlersuche bei Problemen mit geschachtelten Dictionary-Objekten, mehrfachen Funktionsaufrufen und komplexen arithmetischen Ausdrücken. Traceback (most recent call last): File "calculation.py", line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- Die Unterstützung für Ausnahmegruppen wurde hinzugefügt, die es dem Programm ermöglichen, mehrere unterschiedliche Ausnahmen gleichzeitig zu generieren und zu verarbeiten. Um mehrere Ausnahmen zu gruppieren und gemeinsam aufzurufen, wurden die neuen Ausnahme-Typen ExceptionGroup und BaseExceptionGroup eingeführt, und um einzelne Ausnahmen aus der Gruppe zu extrahieren, wurde der Ausdruck „except*“ hinzugefügt.
- In der Klasse BaseException wurde die Methode add_note() hinzugefügt, die es ermöglicht, einen Textkommentar zur Ausnahme hinzuzufügen, zum Beispiel um kontextuelle Informationen, die zum Zeitpunkt der Ausnahmeanpassung nicht verfügbar sind, zu ergänzen.
- Ein spezieller Typ Self wurde eingeführt, der die aktuelle geschlossene Klasse darstellt. Self kann verwendet werden, um Methoden zu annotieren, die eine Instanz ihrer Klasse zurückgeben, auf eine einfachere Weise als mit TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Ein neuer Typ LiteralString wurde hinzugefügt, der nur Zeichenfolgenliterale enthalten kann, die mit dem Typ LiteralString kompatibel sind (d.h. einfache Zeichenfolgen und Zeichenfolgen des Typs LiteralString, aber keine willkürlichen und nicht kombinierten Zeichenfolgen des Typs str). Der Typ LiteralString kann verwendet werden, um die Übergabe von Zeichenfolgenargumenten an Funktionen einzuschränken, bei denen eine willkürliche Einfügung von Teilen von Zeichenfolgen zu Sicherheitsanfälligkeiten führen kann, beispielsweise bei der Erstellung von Zeichenfolgen für SQL-Abfragen oder Shell-Befehle. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(„SELECT * FROM students“) # ok run_query(literal_string) # ok run_query(„SELECT * FROM “ + literal_string) # ok run_query(arbitrary_string) # Fehler run_query( # Fehler f„SELECT * FROM students WHERE name = {arbitrary_string}“ )
- Ein Typ TypeVarTuple wurde hinzugefügt, который позволяет использовать вариативные дженерики, в отличие от TypeVar охватывающие не один тип, а произвольное число типов.
- Die Standardbibliothek wurde um das Modul tomllib erweitert, das Funktionen zum Parsen des TOML-Formats enthält.
- Es wurde die Möglichkeit hinzugefügt, einzelne Elemente von typisierten Wörterbüchern (TypedDict) mit den Labels Required und NotRequired zu kennzeichnen, um erforderliche und nicht erforderliche Felder zu bestimmen (standardmäßig sind alle deklarierten Felder erforderlich, es sei denn, der Parameter total wird auf False gesetzt). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars"} # OK (Feld year ist optional) m3: Movie = {"year": 2022} # Fehler, das erforderliche Feld title wurde nicht ausgefüllt
- Im Modul asyncio wurde die Klasse TaskGroup hinzugefügt, die einen asynchronen Kontextmanager implementiert, der auf den Abschluss einer Gruppe von Aufgaben wartet. Aufgaben können mit der Methode create_task() zur Gruppe hinzugefügt werden. async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print("Beide Aufgaben sind jetzt abgeschlossen.")
- Ein Dekorator für Klassen, Methoden und Funktionen @dataclass_transform wurde hinzugefügt. Bei Angabe dieses Dekorators interpretiert das statische Typprüfsystem das Objekt so, als würde der Dekorator @dataclasses.dataclass verwendet. Im folgenden Beispiel wird die Klasse CustomerModel bei der Typprüfung analog zur Klasse mit dem Dekorator @dataclasses.dataclass behandelt, d.h. sie wird als Klasse mit einer __init__-Methode angesehen, die die Variablen id und name akzeptiert. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- In regulären Ausdrücken wurde die Möglichkeit hinzugefügt, atomare Gruppierungen ((?>…)) und gierige (possessive) Quantifizierer (*+, ++, ?+, {m,n}+) zu verwenden.
- Eine Befehlszeilenoption „-P“ und eine Umgebungsvariable PYTHONSAFEPATH wurden hinzugefügt, um das automatische Anhängen potenziell unsicherer Dateipfade an sys.path zu deaktivieren.
- Das Dienstprogramm py.exe für die Windows-Plattform wurde erheblich verbessert, mit Unterstützung für die Syntax „-V:<company>/<tag>“ zusätzlich zu „-<major>.<minor>“.
- Viele Makros in der C-API wurden in normale oder statische Inline-Funktionen umgewandelt.
- Die folgenden Module wurden als veraltet erklärt und werden in der Version Python 3.13 entfernt: uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev und sunau. Die Funktionen PyUnicode_Encode* wurden entfernt.
Quelle: opennet.ru
