Nach einem Jahr der Entwicklung wurde eine bedeutende Version der Programmiersprache Python 3.10 veröffentlicht. Dieser neue Branch wird eineinhalb Jahre lang unterstützt, gefolgt von weiteren dreieinhalb Jahren, in denen Sicherheitskorrekturen bereitgestellt werden.
Gleichzeitig begann die Alpha-Tests für den Branch Python 3.11 (gemäß dem neuen Entwicklungszeitplan beginnt 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.11 wird während sieben Monaten in der Alpha-Version sein, in denen neue Funktionen hinzugefügt und Fehler behoben werden. Danach wird es über drei Monate Beta-Tests geben, während denen das Hinzufügen neuer Funktionen untersagt ist und der Fokus auf der Fehlerbehebung liegt. Die letzten zwei Monate vor der Veröffentlichung wird der Branch in der Release-Kandidaten-Phase sein, in der die endgültige Stabilisierung durchgeführt wird.
Zu den Neuerungen in Python 3.10 gehören:
- Die Operatoren „match“ und „case“ wurden implementiert, um Mustervergleiche zu ermöglichen. Diese verbessern die Lesbarkeit des Codes, erleichtern das Matching beliebiger Python-Objekte und erhöhen die Zuverlässigkeit des Codes durch erweiterte statische Typprüfung. Die Implementierung erinnert stark an den „match“-Operator, der in den Sprachen Scala, Rust und F# zur Verfügung steht. Dieser vergleicht das Ergebnis des angegebenen Ausdrucks mit einer Liste von Mustern, die in den Klammern des „case“-Operators aufgelistet sind.
def http_error(status): match status: case 400: return «Bad request» case 401|403|404: return «Not allowed» case 418: return «I’m a teapot» case _: return «Something else»
Es ist möglich, Objekte, Tupel, Listen und beliebige Sequenzen zu entpacken, um Variablen basierend auf vorhandenen Werten zu binden. Die Definition von geschachtelten Mustern, die Verwendung zusätzlicher "if"-Bedingungen im Pattern Matching, die Anwendung von Masken ("[x, y, *rest]"), die Zuordnung von Schlüssel-Wert-Paaren (zum Beispiel {"bandwidth": b, "latency": l} zur Extraktion der Werte "bandwidth" und "latency" aus einem Dictionary), die Extraktion von Untermustern (Operator ":=") sowie die Verwendung benannter Konstanten im Muster sind zulässig. In Klassen kann das Verhalten beim Matching mit der Methode "__match__()" angepasst werden.
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Ursprung") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Irgendwo anders") case _: print("Kein Punkt") match point: case Point(x, y) if x == y: print(f"Y=X bei {x}") case Point(x, y): print(f"Nicht auf der Diagonale") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Ich sehe rot!") case GREEN: print("Das Gras ist grün") case BLUE: print("Ich fühle mich blau :( ")
- Es wurde die Möglichkeit eingeführt, runde Klammern im `with`-Operator zu verwenden, um die Definition einer Sammlung von Kontextmanagern über mehrere Zeilen zu verteilen. Es ist auch erlaubt, ein Komma nach dem letzten Kontextmanager in der Gruppe zu belassen: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Die Informationen über den Standort im Code wurden verbessert, insbesondere bei Fehlern, die mit nicht geschlossenen geschweiften Klammern und Anführungszeichen in Stringliteralen verbunden sind. Zum Beispiel, wenn eine geschweifte Klammer nicht geschlossen wird, wird anstelle einer Syntaxfehlerwarnung für die folgende Konstruktion nun die öffnende geschweifte Klammer hervorgehoben, und es wird auf den fehlenden schließenden Block hingewiesen. 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 spezialisierte Fehlermeldungen wurden hinzugefügt: fehlendes Zeichen „:“ vor Blöcken und in Dictionaries, fehlende Klammern bei Tupeln, fehlendes Komma in Listen, Angabe eines „try“-Blocks ohne „except“ und „finally“, Verwendung von „=“ anstelle von „==“ in Vergleichen sowie die Angabe von *-Ausdrücken in f-Strings. Darüber hinaus wird nun der gesamte problematische Ausdruck hervorgehoben, nicht nur der Anfang, und es erfolgt eine klarere Benachrichtigung über den Kontext von Fehlern, die mit falscher Einrückung zusammenhängen. >>> def foo(): … if lel: … x = 2 Datei „“, Zeile 3 x = 2 ^ IndentationError: nach der ‚if‘-Anweisung in Zeile 2 wurde ein eingerückter Block erwartet.
Bei Fehlern, die durch Tippfehler in Attributnamen und Variablennamen in der Funktion verursacht werden, wird eine Empfehlung mit dem richtigen Namen ausgegeben. >>> collections.namedtoplo Rückverfolgung (neueste Anruf zuletzt): Datei „“, Zeile 1, in AttributeError: Modul ‚collections‘ hat kein Attribut ‚namedtoplo‘. Meinten Sie: namedtuple?
- Für Debugging-Tools und Profiler wird in den Traceback-Ereignissen die genaue Zeilennummer des ausgeführten Codes angezeigt.
- Die Einstellung sys.flags.warn_default_encoding wurde hinzugefügt, um eine Warnung bezüglich potenzieller Fehler im Zusammenhang mit der Verarbeitung in TextIOWrapper und open() für Dateien in UTF-8-Codierung ohne explizite Angabe der Option ‘encoding=»utf-8»‘ auszugeben (standardmäßig wird ASCII-Codierung verwendet). Außerdem wurde in dieser Version die Möglichkeit hinzugefügt, den Wert ‘encoding=»locale»‘ anzugeben, um die Codierung basierend auf der aktuellen Locale festzulegen.
- Im Modul typing, das Mittel zur Angabe von Typannotationen bereitstellt, wurde ein neuer Operator hinzugefügt, der die Verwendung der Syntax „X | Y“ zur Auswahl eines der Typen (Typ X oder Typ Y) ermöglicht. def square(number: int | float) -> int | float: return number ** 2 ist äquivalent zu der zuvor unterstützten Konstruktion: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Im Modul typing wurden der Operator Concatenate und die Variable ParamSpec hinzugefügt, die es ermöglichen, zusätzliche Informationen für die statische Typprüfung bei der Verwendung von Callable bereitzustellen. Im Modul typing wurden außerdem spezielle Werte für TypeGuard zum Annotieren von Typgeschützten Funktionen sowie TypeAlias für die explizite Definition von Typaliasen hinzugefügt. StrCache: TypeAlias = ‘Cache[str]’ # ein Typalias
- In der Funktion zip() wurde ein optionales Flag „strict“ implementiert, das die Überprüfung der gleichen Länge der übergebenen Argumente durchführt. >>> 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
- Es wurden neue eingebaute Funktionen aiter() und anext() vorgeschlagen, die asynchrone Entsprechungen der Funktionen iter() und next() implementieren.
- Die Arbeitsgeschwindigkeit der Konstruktoren str(), bytes() und bytearray() wurde um 30-40% bei der Arbeit mit kleinen Objekten beschleunigt.
- Die Anzahl der Importoperationen im Modul runpy wurde verringert. Der Befehl „python3 -m modulname“ wird jetzt im Durchschnitt 1,4-mal schneller ausgeführt, da die importierten Module von 69 auf 51 reduziert wurden.
- In der Anweisung LOAD_ATTR wurde ein Caching-Mechanismus für einzelne Opcode implementiert, der die Arbeit mit regulären Attributen um bis zu 36% und mit Slots um bis zu 44% beschleunigt hat.
- Beim Bauen von Python mit der Option „—enable-optimizations“ wird jetzt der Modus „-fno-semantic-interposition“ aktiviert, der die Interpreter-Geschwindigkeit im Vergleich zum Bauen mit der Option „—enable-shared“ um bis zu 30% steigert.
- In den Modulen hashlib und ssl Die Unterstützung für OpenSSL 3.0.0 wurde hinzugefügt, während die Unterstützung für Versionen von OpenSSL älter als 1.1.1 eingestellt wurde.
- Der alte Parser wurde entfernt, ersetzt durch den PEG-Parser (Parsing Expression Grammar), der in der vorherigen Version eingeführt wurde. Das Formatter-Modul wurde entfernt. Der Parameter 'loop' wurde aus der API asyncio entfernt. Vorher als veraltet markierte Methoden wurden gelöscht. Funktionen, die mit Py_UNICODE_str* arbeiten, die Py_UNICODE*-Strings manipulieren, wurden entfernt.
- Das Modul distutils wurde als veraltet erklärt und ist für die Entfernung in Python 3.12 geplant. Statt distutils wird empfohlen, die Module setuptools, packaging, platform, shutil, subprocess und sysconfig zu verwenden. Die wstr-Struktur wurde ebenfalls als veraltet eingestuft und ist für die Entfernung in PyUnicodeObject vorgesehen.
Quelle: opennet.ru
