Veröffentlichung der Programmiersprache Python 3.10

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:

  • Implementierte „Match“- und „Case“-Operatoren für den Mustervergleich, die die Lesbarkeit des Codes verbessern, den Abgleich beliebiger Python-Objekte vereinfachen und die Codezuverlässigkeit durch erweiterte statische Typprüfung erhöhen. Die Implementierung ähnelt stark dem in Scala, Rust und F# bereitgestellten „Match“-Operator, der das Ergebnis eines angegebenen Ausdrucks mit einer Liste von Mustern vergleicht, die in Blöcken basierend auf dem „Case“-Operator aufgelistet sind.

    def http_error(status): Übereinstimmungsstatus: Fall 400: „Ungültige Anfrage“ zurückgeben Fall 401|403|404: „Nicht erlaubt“ 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.

    aus Datenklassen Datenklasse importieren @Datenklasse Klasse Punkt: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origin") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Somewhere else") case _: print("Not a point") Übereinstimmung point: case Point(x, y) if x == y: print(f"Y=X at {x}") case Point(x, y): print(f"Not on the diagonal") ROT, GRÜN, BLAU = 0, 1, 2 passende Farbe: case ROT: print („Ich sehe rot!“) case GRÜN: print („Gras ist grün“) case BLAU: print („Ich fühle den Blues :(“)

  • Es ist jetzt möglich, Klammern in der with-Anweisung zu verwenden, um die Definition einer Sammlung von Kontextmanagern auf mehrere Zeilen aufzuteilen. Es ist auch erlaubt, nach dem letzten Kontextmanager in der Gruppe ein Komma zu hinterlassen: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): ...
  • Verbesserte Meldung der Codeposition von Fehlern im Zusammenhang mit nicht geschlossenen Klammern und Anführungszeichen in Zeichenfolgenliteralen. Wenn beispielsweise eine nicht geschlossene geschweifte Klammer vorhanden ist, wird im folgenden Konstrukt kein Syntaxfehler gemeldet, sondern der Zeiger hebt jetzt die öffnende geschweifte Klammer hervor und zeigt an, dass kein schließender Block vorhanden ist. 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 einem Block und in Wörterbüchern, kein Trennen eines Tupels durch Klammern, fehlendes Komma in Listen, Angabe eines „try“-Blocks ohne „exclusive“ und „finally“ mit „=“. " anstelle von "= =" in Vergleichen, Angabe von *-Ausdrücken in F-Strings. Darüber hinaus wird sichergestellt, dass der gesamte problematische Ausdruck hervorgehoben wird, nicht nur der Anfang, und dass explizitere Informationen über den Kontext von Fehlern im Zusammenhang mit fehlerhafter Einrückung bereitgestellt werden. >>> def foo(): ... if lel: ... x = 2 Datei " ", Zeile 3 x = 2 ^ IndentationError: erwartete einen eingerückten Block nach der 'if'-Anweisung in Zeile 2

    Bei Fehlern, die durch Tippfehler in den Namen von Attributen und Variablennamen in einer Funktion verursacht werden, wird eine Empfehlung mit dem korrekten Namen ausgegeben. >>>collections.namedtoplo Traceback (letzter Aufruf zuletzt): Datei « ", 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 eine Warnung vor potenziellen Fehlern im Zusammenhang mit der Verarbeitung von UTF-8-codierten Dateien durch TextIOWrapper und open() anzuzeigen, ohne explizit die Option „encoding=»utf-8“ anzugeben (standardmäßig wird ASCII-Codierung verwendet). . Die neue Version bietet außerdem die Möglichkeit, einen „encoding="locale"“-Wert anzugeben, um die Codierung basierend auf dem aktuellen Gebietsschema festzulegen.
  • Dem Typisierungsmodul wurde ein neuer Operator hinzugefügt, der Tools zum Angeben von Typanmerkungen bereitstellt und die Verwendung der Syntax „X |“ ermöglicht Y“, um einen der Typen auszuwählen (X-Typ oder Y-Typ). def quadrat(zahl: int | float) -> int | float: Rückgabezahl ** 2 entspricht dem zuvor unterstützten Konstrukt: def quadrat(zahl: Union[int, float]) -> Union[int, float]: Rückgabezahl ** 2
  • Dem Typisierungsmodul wurden der Concatenate-Operator und die ParamSpec-Variable hinzugefügt, mit denen Sie bei Verwendung von Callable zusätzliche Informationen für die statische Typprüfung übergeben können. Das Typisierungsmodul fügt außerdem den Sonderwert TypeGuard hinzu, um Typschutzfunktionen zu kommentieren, und TypeAlias, um einen Typalias explizit zu definieren. StrCache: TypeAlias ​​​​= 'Cache[str]' # ein Typalias
  • Die Funktion zip() implementiert ein optionales „strict“-Flag, das bei Angabe prüft, ob die iterierten Argumente die gleiche 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 (letzter Aufruf zuletzt ): … 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 Importvorgänge im Runpy-Modul wurde reduziert. Der Befehl „python3 -m module_name“ läuft aufgrund der Reduzierung der importierten Module von 1.4 auf 69 jetzt im Durchschnitt 51-mal schneller.
  • 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, der eine Beschleunigung des Interpreters um bis zu 30 % im Vergleich zum Erstellen mit der Option „--enable-shared“ ermöglicht " Möglichkeit.
  • Die Module hashlib und ssl haben Unterstützung für OpenSSL 3.0.0 hinzugefügt und unterstützen keine OpenSSL-Versionen vor 1.1.1 mehr.
  • Der alte Parser wurde entfernt, der im vorherigen Zweig durch den PEG-Parser (Parsing Expression Grammar) ersetzt wurde. Das Formatierungsmodul wurde entfernt. Der Schleifenparameter wurde aus der Asyncio-API entfernt. Zuvor veraltete Methoden wurden entfernt. Die Py_UNICODE_str*-Funktionen, die Py_UNICODE*-Strings manipulieren, wurden entfernt.
  • Das distutils-Modul ist veraltet und soll in Python 3.12 entfernt werden. Anstelle von Distutils wird empfohlen, die Module Setuptools, Packaging, Platform, Shutil, Subprocess und Sysconfig zu verwenden. Die wstr-Struktur in PyUnicodeObject ist veraltet und soll entfernt werden.

Source: opennet.ru

Kommentar hinzufügen