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
