Nach einem Jahr Entwicklung wurde eine bedeutende Version der Programmiersprache Python 3.10 veröffentlicht. Der neue Branch wird anderthalb Jahre lang unterstĂŒtzt, danach werden ĂŒber einen Zeitraum von dreieinhalb Jahren Korrekturen zur Behebung von SicherheitsanfĂ€lligkeiten bereitgestellt.
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 sieben Monate lang in der Alpha-Phase sein, in der neue Funktionen hinzugefĂŒgt und Fehlerbehebungen durchgefĂŒhrt werden. Danach wird es drei Monate lang Beta-Versionstests geben, wĂ€hrend derer das HinzufĂŒgen neuer Funktionen verboten ist und die gesamte Aufmerksamkeit der Fehlerbehebung gewidmet wird. Die letzten zwei Monate vor der Veröffentlichung wird der Branch sich in der Release-Kandidat-Phase befinden, in der die endgĂŒltige Stabilisierung erfolgen wird.
Unter den Neuerungen in Python 3.10 sind:
- Die Operatoren âmatchâ und âcaseâ wurden implementiert, um Mustervergleiche zu ermöglichen, die die Lesbarkeit des Codes verbessern, das Pattern-Matching beliebiger Python-Objekte vereinfachen und die CodezuverlĂ€ssigkeit durch die Möglichkeit einer erweiterten statischen TypprĂŒfung erhöhen. Die Implementierung erinnert stark an den âmatchâ-Operator, der in den Sprachen Scala, Rust und F# angeboten wird und der das Ergebnis eines angegebenen Ausdrucks mit einer Liste von in âcaseâ-Blöcken aufgefĂŒhrten Mustern vergleicht.
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, Tuple, Listen und beliebige Sequenzen zu entpacken, um Variablen basierend auf vorhandenen Werten zu binden. Das Definieren von verschachtelten Mustern, die Verwendung zusĂ€tzlicher Bedingungen "if" im Muster, die Anwendung von Masken ("[x, y, *rest]"), das Mapping von SchlĂŒssel/Wert-Paaren (zum Beispiel {"bandwidth": b, "latency": l} zur Extraktion der Werte "bandwidth" und "latency" aus einem Dictionary), das Extrahieren von Untermustern (Operator ":=") und die Verwendung benannter Konstanten im Muster sind zulĂ€ssig. In Klassen kann das Verhalten beim Matching durch die 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 Diagonalen") 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 traurig :( ")
- Es wurde die Möglichkeit geschaffen, runde Klammern im "with"-Operator zu verwenden, um die Definition einer Sammlung von Kontextmanagern auf mehrere Zeilen zu verteilen. Es ist auch zulĂ€ssig, nach dem endgĂŒltigen Kontextmanager in der Gruppe ein Komma zu lassen: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): âŠ
- Die Fehlermeldungen fĂŒr nicht geschlossene geschweifte Klammern und AnfĂŒhrungszeichen in String-Literalen wurden verbessert. Zum Beispiel wird bei einer nicht geschlossenen geschweiften Klammer nicht mehr auf den Syntaxfehler in der unmittelbar folgenden Konstruktion hingewiesen; stattdessen wird die öffnende geschweifte Klammer hervorgehoben und es wird auf das Fehlen des schlieĂenden Blocks hingewiesen. File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: '{' wurde nie geschlossen
ZusĂ€tzliche spezialisierte Fehlermeldungen zur Syntax wurden hinzugefĂŒgt: Fehlen des Zeichens â:â vor einem Block und in DictionĂ€ren, keine Klammerung von Tupeln, Fehlen eines Kommas in Listen, Verwendung des Blocks âtryâ ohne âexceptâ und âfinallyâ, Verwendung von â=â statt â==â in Vergleichen, Angabe von *-AusdrĂŒcken in f-Strings. AuĂerdem wird jetzt der gesamte problematische Ausdruck hervorgehoben und eine klarere Information ĂŒber den Kontext von Fehlern, die mit falscher EinrĂŒckung zusammenhĂ€ngen, bereitgestellt. >>> def foo(): ⊠if lel: ⊠x = 2 Datei ââ, Zeile 3 x = 2 ^ IndentationError: erwartet einen eingerĂŒckten Block nach der âifâ-Anweisung in Zeile 2.
Bei den Fehlern, die durch Tippfehler in Attributnamen und Variablennamen in Funktionen verursacht wurden, wird eine Empfehlung mit dem korrekten Namen ausgegeben. >>> collections.namedtoplo Traceback (der letzte Aufruf zuletzt): Datei ââ, Zeile 1, in AttributeError: Modul âcollectionsâ hat kein Attribut ânamedtoploâ. Meinten Sie: namedtuple?
- FĂŒr Debugging-Tools und Profiler wurden prĂ€zise Zeilennummern des ausgefĂŒhrten Codes in den Trace-Events bereitgestellt.
- Die Einstellung sys.flags.warn_default_encoding wurde hinzugefĂŒgt, um eine Warnung ĂŒber potenzielle Fehler im Zusammenhang mit der Verarbeitung in TextIOWrapper und open() von Dateien im UTF-8-Format ohne explizite Angabe der Option 'encoding="utf-8"' auszugeben (StandardmĂ€Ăig wird die ASCII-Codierung verwendet). AuĂerdem wird in der neuen Version die Möglichkeit zur Angabe von 'encoding="locale"' bereitgestellt, um die Codierung basierend auf der aktuellen Gebietsschema 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 entspricht 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 TypeGuard zur Annotation von Typenschutzfunktionen und TypeAlias zur expliziten Definition von Typaliasen hinzugefĂŒgt. StrCache: TypeAlias = 'Cache[str]' # ein Typalias
- In der Funktion zip() wurde ein optionales Flag "strict" implementiert, bei dessen Angabe eine ĂberprĂŒfung auf gleiche LĂ€nge der durchlaufenen Argumente erfolgt. >>> 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
- Neue eingebaute Funktionen aiter() und anext() wurden vorgeschlagen, die asynchrone Entsprechungen der Funktionen iter() und next() implementieren.
- Die Leistung der Konstruktoren str(), bytes() und bytearray() wurde bei der Arbeit mit kleinen Objekten um 30-40% beschleunigt.
- Die Anzahl der Importoperationen im Modul runpy wurde reduziert. Der Befehl "python3 -m modulname" wird ŃДпДŃŃ im Durchschnitt 1,4-mal schneller ausgefĂŒhrt, da die importierten Module von 69 auf 51 reduziert wurden.
- Im Befehl LOAD_ATTR wurde ein Caching-Mechanismus fĂŒr bestimmte Bytecodes verwendet, der die Arbeit mit regelmĂ€Ăigen Attributen um bis zu 36% und mit Slots um bis zu 44% beschleunigt hat.
- Bei der Erstellung von Python mit der Option "âenable-optimizations" wird jetzt der Modus "-fno-semantic-interposition" aktiviert, der die Leistung des Interpreters im Vergleich zur Erstellung mit der Option "âenable-shared" um bis zu 30% verbessert.
- In den Modulen hashlib und ssl wurde die UnterstĂŒtzung fĂŒr OpenSSL 3.0.0 hinzugefĂŒgt und die UnterstĂŒtzung fĂŒr OpenSSL-Versionen Ă€lter als 1.1.1 eingestellt.
- Der alte Parser wurde entfernt, zu dessen Ersatz in der vorherigen Version der PEG-Parser (Parsing Expression Grammar) kam. Das Modul formatter wurde entfernt. Der Parameter loop wurde aus der API von asyncio entfernt. Methoden, die zuvor als veraltet erklÀrt wurden, wurden entfernt. Funktionen Py_UNICODE_str*, die mit Py_UNICODE*-Strings arbeiten, 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 Struktur wstr in PyUnicodeObject wurde ebenfalls in die Liste der veralteten und zur Entfernung vorgesehenen Elemente aufgenommen.
Quelle: opennet.ru
