Nach einem Jahr Entwicklungszeit wird die bedeutende Veröffentlichung der Programmiersprache Python 3.10 vorgestellt. 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.11-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.11-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.10 gehören:
- Die Match- und Case-Operatoren für Mustervergleiche wurden implementiert, um die Lesbarkeit des Codes zu verbessern, den Vergleich beliebiger Python-Objekte zu vereinfachen und die Codezuverlässigkeit durch erweiterte statische Typprüfung zu verbessern. Die Implementierung ähnelt stark dem Match-Operator von Scala, Rust und F#, der das Ergebnis der Ausführung eines angegebenen Ausdrucks mit einer Liste von Mustern vergleicht, die in case-basierten Blöcken aufgelistet sind.
def http_error(status): Status abgleichen: Fall 400: „Ungültige Anfrage“ zurückgeben. Fall 401|403|404: „Nicht zulässig“ zurückgeben. Fall 418: „Ich bin eine Teekanne“ zurückgeben. Fall _: „Etwas anderes“ zurückgeben.
Sie können Objekte, Tupel, Listen und beliebige Sequenzen entpacken, um Variablen basierend auf vorhandenen Werten zu binden. Es ist erlaubt, verschachtelte Vorlagen zu definieren, zusätzliche „if“-Bedingungen in der Vorlage zu verwenden, Masken („[x, y, *rest]“) und Schlüssel/Wert-Zuordnungen (z. B. {„bandwidth“: b, „latency“) zu verwenden ”: l}, um „Bandbreiten“- und „Latenz“-Werte aus einem Wörterbuch zu extrahieren, Untervorlagen zu extrahieren („:="-Operator) und benannte Konstanten in einer Vorlage zu verwenden. In Klassen ist es möglich, das Matching-Verhalten mithilfe der Methode „__match__()“ anzupassen.
von Datenklassen importiere Datenklasse @Datenklasse Klasse Punkt: x: int y: int def whereis(Punkt): Punkt abgleichen: Fall Punkt(0, 0): drucken("Ursprung") Fall Punkt(0, y): drucken(f"Y={y}") Fall Punkt(x, 0): drucken(f"X={x}") Fall Punkt(): drucken("Irgendwo anders") Fall _: drucken("Kein Punkt") Punkt abgleichen: Fall Punkt(x, y), wenn x == y: drucken(f"Y=X bei {x}") Fall Punkt(x, y): drucken(f"Nicht auf der Diagonale") ROT, GRÜN, BLAU = 0, 1, 2 Farbe abgleichen: Fall ROT: drucken("Ich sehe Rot!") Fall GRÜN: drucken("Gras ist grün") Fall BLAU: drucken("Ich bin niedergeschlagen :(")
- Die Möglichkeit, Klammern im with-Operator zu verwenden, um die Definition einer Sammlung von Kontextmanagern auf mehrere Zeilen zu verteilen, besteht. Insbesondere ist es zulässig, nach dem letzten Kontextmanager einer Gruppe ein Komma zu setzen: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Verbesserte Meldung der Fehlerposition im Code im Zusammenhang mit offenen geschweiften Klammern und Anführungszeichen in Zeichenfolgenliteralen. Beispielsweise wird bei einer offenen geschweiften Klammer in der folgenden Konstruktion kein Syntaxfehler mehr gemeldet, sondern der Zeiger hebt nun die öffnende geschweifte Klammer hervor und meldet das Fehlen eines schließenden Blocks. Datei "example.py", Zeile 1 erwartet = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: '{' wurde nie geschlossen
Zusätzliche spezielle Syntaxfehlermeldungen hinzugefügt: Fehlendes ":"-Symbol vor Blöcken und in Wörterbüchern, fehlendes Einschließen von Tupeln in Klammern, fehlendes Komma in Listen, Angabe eines "try"-Blocks ohne "except" und "finally", Verwendung von "=" statt "==" in Vergleichen, Angabe von *-Ausdrücken in F-Strings. Darüber hinaus wird der gesamte problematische Ausdruck hervorgehoben, nicht nur sein Anfang, und der Kontext von Fehlern im Zusammenhang mit falscher Einrückung wird deutlicher angezeigt. >>> def foo(): … if lel: … x = 2 File " ", Zeile 3 x = 2 ^ IndentationError: Erwartet wurde ein eingerückter Block nach der 'if'-Anweisung in Zeile 2
Bei Fehlern durch Tippfehler in Attributnamen und Variablennamen in der Funktion wird die Empfehlung mit dem richtigen Namen ausgegeben. >>> collections.namedtoplo Traceback (most recent call last): File « ", Zeile 1, in AttributeError: Modul „collections“ hat kein Attribut „namedtoplo“. Meinten Sie „namedtuple“?
- Für Debugging-Tools und Profiler werden Trace-Ereignisse mit den genauen Zeilennummern des ausgeführten Codes bereitgestellt.
- Die Einstellung sys.flags.warn_default_encoding wurde hinzugefügt, um vor möglichen Fehlern im Zusammenhang mit der Verarbeitung von UTF-8-kodierten Dateien durch TextIOWrapper und open() zu warnen, ohne die Option „encoding="utf-8"“ explizit anzugeben (standardmäßig wird ASCII-Kodierung verwendet). In der neuen Version besteht außerdem die Möglichkeit, den Wert „encoding="locale"“ anzugeben, um die Kodierung basierend auf dem aktuellen Gebietsschema festzulegen.
- Das Typisierungsmodul, das die Möglichkeit bietet, Typanmerkungen anzugeben, verfügt über einen neuen Operator, der die Syntax „X | Y“ ermöglicht, um einen der Typen (Typ X oder Typ Y) auszuwählen. def square(number: int | float) -> int | float: return number ** 2 ist äquivalent zur zuvor unterstützten Konstruktion: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Das Typisierungsmodul wurde um den Concatenate-Operator und die ParamSpec-Variable erweitert, die die Übergabe zusätzlicher Informationen für die statische Typprüfung bei Verwendung von Callable ermöglichen. Das Typisierungsmodul wurde außerdem um die speziellen TypeGuard-Werte zur Annotation von Typwächtern und TypeAlias zur expliziten Definition eines Typalias aktualisiert. StrCache: TypeAlias = 'Cache[str]' # ein Typalias
- Die Funktion zip() verfügt über ein optionales „strict“-Flag, das, wenn angegeben, prüft, ob die Argumente, über die iteriert wird, dieselbe Länge haben. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2), ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (most recent call last): … ValueError: zip()-Argument 2 ist länger als Argument 1
- Mit der Implementierung asynchroner Analoga zu den Funktionen iter() und next() werden neue integrierte Funktionen aiter() und anext() vorgeschlagen.
- Die Arbeit der Konstruktoren str(), bytes() und bytearray() bei der Arbeit mit kleinen Objekten wurde um 30-40 % beschleunigt.
- Die Anzahl der Importe im Runpy-Modul wurde reduziert. Der Befehl "python3 -m module_name" läuft jetzt durchschnittlich 1.4-mal schneller, da die Anzahl der importierten Module von 69 auf 51 reduziert wurde.
- Die LOAD_ATTR-Anweisung verwendet einen Caching-Mechanismus für einzelne Opcodes, wodurch die Arbeit mit regulären Attributen um bis zu 36 % und mit Slots um bis zu 44 % beschleunigt werden konnte.
- Beim Erstellen von Python mit der Option „--enable-optimizations“ ist jetzt der Modus „-fno-semantic-interposition“ aktiviert, wodurch der Interpreter bis zu 30 % schneller ausgeführt wird als beim Erstellen mit der Option „--enable-shared“.
- In der Hashbibliothek und den Modulen ssl Unterstützung für OpenSSL 3.0.0 wurde hinzugefügt, die Unterstützung für OpenSSL-Versionen älter als 1.1.1 wurde eingestellt.
- Alter Parser entfernt und durch PEG-Parser (Parsing Expression Grammar) im vorherigen Zweig ersetzt. Formatierungsmodul entfernt. Loop-Parameter aus der asyncio-API entfernt. Zuvor als veraltet deklarierte Methoden entfernt. Py_UNICODE_str*-Funktionen, die Py_UNICODE*-Strings manipulieren, entfernt.
- Das Modul distutils ist veraltet und soll in Python 3.12 entfernt werden. Stattdessen werden die folgenden Module empfohlen: setuptools, packaging, platform, shutil, subprocess und sysconfig. Die wstr-Struktur wurde nach PyUnicodeObject verschoben und ist veraltet und soll entfernt werden.
Source: opennet.ru
