Veröffentlichung der Programmiersprache Python 3.11

Nach einem Jahr Entwicklungszeit wurde die bedeutende Version der Programmiersprache Python 3.11 veröffentlicht. Der neue Zweig wird eineinhalb Jahre lang unterstützt, danach werden für weitere dreieinhalb Jahre Fixes zur Beseitigung von Schwachstellen generiert.

Gleichzeitig begann der Alpha-Test des Python 3.12-Zweigs (gemäß dem neuen Entwicklungsplan beginnt die Arbeit an einem neuen Zweig fünf Monate vor der Veröffentlichung des vorherigen Zweigs und erreicht die Alpha-Testphase zum Zeitpunkt der nächsten Veröffentlichung ). Der Python 3.12-Zweig wird sieben Monate lang in der Alpha-Version sein, in der neue Funktionen hinzugefügt und Fehler behoben werden. Danach werden die Betaversionen drei Monate lang getestet. Während dieser Zeit ist das Hinzufügen neuer Funktionen verboten und die gesamte Aufmerksamkeit wird auf die Behebung von Fehlern gerichtet. In den letzten zwei Monaten vor der Veröffentlichung befindet sich der Zweig im Release Candidate-Stadium, in dem die endgültige Stabilisierung durchgeführt wird.

Zu den neuen Ergänzungen zu Python 3.11 gehören:

  • Es wurden erhebliche Anstrengungen unternommen, um die Leistung zu optimieren. Der neue Zweig umfasst Änderungen im Zusammenhang mit der Beschleunigung und Inline-Bereitstellung von Funktionsaufrufen sowie der Verwendung schneller Interpreter von Standardoperationen (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq) sowie Optimierungen, die von den Projekten Cinder und HotPy vorbereitet wurden. Abhängig von der Art der Belastung kommt es zu einer Steigerung der Code-Ausführungsgeschwindigkeit von 10–60 %. Im Durchschnitt stieg die Leistung der Pyperformance-Testsuite um 25 %.

    Der Bytecode-Caching-Mechanismus wurde neu gestaltet, wodurch die Startzeit des Interpreters um 10–15 % verkürzt wurde. Objekte mit Code und Bytecode werden jetzt vom Interpreter statisch zugewiesen, wodurch die Phasen des Unmarshallings des aus dem Cache extrahierten Bytecodes und der Konvertierung von Objekten mit Code zur Platzierung im dynamischen Speicher entfallen konnten.

  • Beim Anzeigen von Anrufverfolgungen in Diagnosemeldungen ist es jetzt möglich, Informationen über den Ausdruck anzuzeigen, der den Fehler verursacht hat (zuvor wurde nur die Zeile hervorgehoben, ohne anzugeben, welcher Teil der Zeile den Fehler verursacht hat). Erweiterte Trace-Informationen können auch über die API abgerufen und verwendet werden, um einzelne Bytecode-Anweisungen mithilfe der Methode codeobject.co_positions() oder der C-API-Funktion PyCode_Addr2Location() einer bestimmten Position im Quellcode zuzuordnen. Die Änderung erleichtert das Debuggen von Problemen mit verschachtelten Wörterbuchobjekten, mehreren Funktionsaufrufen und komplexen arithmetischen Ausdrücken erheblich. Traceback (letzter Aufruf zuletzt): Datei „calculation.py“, Zeile 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: Division durch Null
  • Unterstützung für Ausnahmegruppen hinzugefügt, wodurch das Programm die Möglichkeit erhält, mehrere verschiedene Ausnahmen gleichzeitig zu generieren und zu verarbeiten. Um mehrere Ausnahmen zu gruppieren und gemeinsam auszulösen, wurden die neuen Ausnahmetypen ExceptionGroup und BaseExceptionGroup vorgeschlagen und der Ausdruck „exclus*“ hinzugefügt, um einzelne Ausnahmen aus einer Gruppe hervorzuheben.
  • Die Methode add_note() wurde zur BaseException-Klasse hinzugefügt, sodass Sie der Ausnahme eine Textnotiz hinzufügen können, um beispielsweise Kontextinformationen hinzuzufügen, die beim Auslösen der Ausnahme nicht verfügbar sind.
  • Ein spezieller Self-Typ wurde hinzugefügt, um die aktuelle private Klasse darzustellen. Mit Self können Methoden, die eine Instanz ihrer Klasse zurückgeben, auf einfachere Weise mit Anmerkungen versehen werden als mit TypeVar. Klasse MyLock: def __enter__(self) -> Self: self.lock() return self
  • Es wurde ein spezieller LiteralString-Typ hinzugefügt, der nur String-Literale enthalten kann, die mit dem LiteralString-Typ kompatibel sind (d. h. leere und LiteralString-Strings, aber keine willkürlichen oder kombinierten Strings). Der Typ LiteralString kann verwendet werden, um die Übergabe von String-Argumenten an Funktionen einzuschränken. Das willkürliche Ersetzen von Teilen von Strings kann zu Schwachstellen führen, beispielsweise beim Generieren von Strings 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}" )
  • Der Typ TypeVarTuple wurde hinzugefügt und ermöglicht die Verwendung von Variablengenerika, im Gegensatz zu TypeVar, das nicht einen Typ, sondern eine beliebige Anzahl von Typen abdeckt.
  • Die Standardbibliothek enthält das tomllib-Modul mit Funktionen zum Parsen des TOML-Formats.
  • Es ist möglich, einzelne Elemente typisierter Wörterbücher (TypedDict) mit den Bezeichnungen „Required“ und „NotRequired“ zu kennzeichnen, um erforderliche und optionale Felder zu bestimmen (standardmäßig sind alle deklarierten Felder erforderlich, wenn der Parameter „total“ nicht auf „False“ gesetzt ist). Klasse Movie(TypedDict): title: str Jahr: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (das Jahresfeld ist optional) m3: Movie = {“year”: 2022} # Fehler, das erforderliche Titelfeld ist nicht ausgefüllt)
  • Die TaskGroup-Klasse wurde dem Asyncio-Modul mit der Implementierung eines asynchronen Kontextmanagers hinzugefügt, der auf den Abschluss einer Gruppe von Aufgaben wartet. Das Hinzufügen von Aufgaben zu einer Gruppe erfolgt mit der Methode create_task(). 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 .")
  • @dataclass_transform-Dekorator für Klassen, Methoden und Funktionen hinzugefügt. Wenn angegeben, behandelt das statische Typprüfungssystem das Objekt so, als würde es den @dataclasses.dataclass-Dekorator verwenden. Im folgenden Beispiel wird die CustomerModel-Klasse beim Überprüfen von Typen ähnlich wie eine Klasse mit dem @dataclasses.dataclass-Dekorator verarbeitet, d. h. als eine __init__-Methode, die ID- und Namensvariablen akzeptiert. @dataclass_transform() Klasse ModelBase: … Klasse CustomerModel(ModelBase): id: int name: str
  • In regulären Ausdrücken wurde die Möglichkeit hinzugefügt, atomare Gruppierungen ((?>...)) und Possessivquantoren (*+, ++, ?+, {m,n}+) zu verwenden.
  • Befehlszeilenoption „-P“ und Umgebungsvariable PYTHONSAFEPATH 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 und unterstützt jetzt die Syntax „-V:“. / " zusätzlich zu "- . "
  • Viele Makros in der C-API werden in reguläre oder statische Inline-Funktionen umgewandelt.
  • Die Module uu, cgi, Pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev und sunau sind veraltet und werden in Python entfernt 3.13-Version. PyUnicode_Encode*-Funktionen entfernt.

Source: opennet.ru

Kommentar hinzufügen