Nach einem Jahr intensiver Entwicklung wurde eine bedeutende Version der Programmiersprache Python 3.12 veröffentlicht. Diese neue Version wird für eineinhalb Jahre unterstützt, gefolgt von weiteren dreieinhalb Jahren für Sicherheitsupdates und Bugfixes.
Gleichzeitig hat das Alpha-Testing der Python 3.13-Version begonnen, in der der CPython-Build-Modus ohne die globale Interpreter-Sperre (GIL, Global Interpreter Lock) eingeführt wurde. Die Version Python 3.13 wird für sieben Monate im Alpha-Release-Stadium bleiben, während dieser Zeit werden neue Funktionen hinzugefügt und Fehler behoben (gemäß dem neuen Entwicklungszeitplan beginnt die Arbeit an der neuen Version fünf Monate vor der Veröffentlichung der vorherigen Version und erreicht zum Zeitpunkt des nächsten Releases den Alpha-Teststatus). Danach wird es über einen Zeitraum von drei Monaten Beta-Tests geben, in denen das Hinzufügen neuer Funktionen untersagt ist und der Fokus auf der Fehlerbehebung liegt. Die letzten zwei Monate vor der Veröffentlichung wird die Version im Release-Kandidaten-Stadium sein, in dem die abschließende Stabilisierung durchgeführt wird.
Zu den Neuerungen in Python 3.12 gehören:
- Die Flexibilität bei der Verarbeitung von f-Strings (formatierte Literale mit dem Präfix 'f') wurde erhöht, was viele Einschränkungen beseitigt hat. Zum Beispiel können in f-Strings jetzt beliebige Ausdrucke, die in Python zulässig sind, verwendet werden, einschließlich mehrzeiliger Ausdrücke, Kommentare, Rückwärtsschslashes und Escape-Sequenzen für Unicode. Darüber hinaus ist es jetzt möglich, innerhalb der inneren Zeichenfolge dieselben Anführungszeichen zu verwenden wie außen (d.h. Sie können jetzt doppelte Anführungszeichen verwenden, ohne auf einfache Anführungszeichen wechseln zu müssen). Die Fehlernachrichten in f-Strings wurden informativer gestaltet, indem jetzt der genaue Ort in der Zeichenfolge angegeben wird, der den Fehler verursacht hat.
In Python 3.12 sind beispielsweise folgende Konstrukte erlaubt: print(f"This is the playlist: {"\n".join(songs)}") print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}") print(f"This is the playlist: {", ".join([ … 'Take me back to Eden', # Mein, mein, diese Augen wie Feuer … 'Alkaline', # Weder sauer noch alkalisch … 'Ascensionism' # Führe zu den zerbrochenen Himmeln endlich … ])}")
- Um die Effizienz der Ressourcennutzung in Mehrkernsystemen zu steigern, wurde die Unterstützung für isolierte Subinterpreter und separate globale Sperren (GIL, Global Interpreter Lock) für verschiedene Interpreter innerhalb eines Prozesses implementiert (CPython ermöglicht es, in einem Prozess mehrere Interpreter gleichzeitig auszuführen). Derzeit ist diese Funktion nur über das C-API verfügbar (die Unterstützung im Python-API wird in der nächsten bedeutenden Version bereitgestellt).
- Im Python-Code wurde die Möglichkeit hinzugefügt, das Buffer-Protokoll zu verwenden. Klassen, die die Methode „__buffer__()“ bereitstellen, können jetzt als Typen verwendet werden, die direkt mit binären Daten im Speicher arbeiten.
- Ein Modul sys.monitoring wurde vorgeschlagen, um das Debugging und die Profilierung zu ermöglichen, das es mit minimalen Overhead ermöglicht, solche Ereignisse in CPython zu verfolgen, wie Funktionsaufrufe, Rückgaben aus Funktionen, die Ausführung beliebiger Codezeilen, Ausnahmen und Übergänge.
- Im Interpreter wurde die Unterstützung für das Linux-Kernel-Perf-Subsystem implementiert, das es ermöglicht, die Namen von Python-Funktionen beim Profiling mit dem Werkzeug perf zu bestimmen (früher wurden nur die Namen von C-Funktionen in den Traces ermittelt).
- Die Fehlermeldungen wurden informativer gestaltet und die Palette der Ausnahmen erweitert, die Empfehlungen zur Behebung von Tippfehlern geben. So werden nun Empfehlungen für den Import vergessener Module aus der Standardbibliothek ausgegeben, es werden Hinweise zur Verwendung des Präfixes „self.“ in Methoden angezeigt, und die korrekte Schreibweise „import x from y“ anstelle von „from y import x“ wird festgestellt. sys.version_info NameError: name 'sys' is not defined. Haben Sie vergessen, 'sys' zu importieren? somethin = blech NameError: name 'blech' is not defined. Meinten Sie: 'self.blech'? import a.y.z from b.y.z SyntaxError: Meinten Sie, 'from … import …' zu verwenden? from collections import chainmap ImportError: nicht möglich, 'chainmap' aus 'collections' zu importieren. Meinten Sie: 'ChainMap'?
- Die Performance-Optimierungen wurden fortgesetzt. Der Gesamtergebnisgewinn aus den hinzugefügten Optimierungen wird auf 5% geschätzt.
- Im Build-Prozess wurde experimentelle Unterstützung für den binären Optimierer BOLT hinzugefügt, der die Leistung um 1-5% steigert.
- Inline-Deployment von List Comprehensions wurde umgesetzt, was die Verarbeitung von List Comprehensions um bis zu das Doppelte beschleunigt (Tests haben bei aktivem Einsatz von List Comprehensions eine Gesamtleistungssteigerung von 11 % gezeigt).
- Die Größe von Unicode-Objekten wurde um 8-16 Byte reduziert.
- Die Operationen mit regulären Ausdrücken re.sub(), re.subn() und re.Pattern wurden beschleunigt.
- Die Ausführung von isinstance()-Prüfungen wurde für einige Protokolle um das 2- bis 20-Fache beschleunigt.
- Die Leistung des asyncio-Pakets wurde deutlich erhöht (in einigen Tests ist eine Beschleunigung von 75 % zu beobachten).
- Die Erstellung der Klasse asyncio.Task wurde beschleunigt.
- Die Funktionen tokenize.tokenize() und tokenize.generate_tokens() wurden in einigen Tests um bis zu 64 % beschleunigt.
- Das Laden von Attributen und der Aufruf der Methode super() wurden beschleunigt.
- Ein neuer, kompakterer Syntax zum Annotieren von Typen für generische Klassen und Funktionen wurde vorgeschlagen. def max[T](args: Iterable[T]) -> T: … class list[T]: def __getitem__(self, index: int, /) -> T: … def append(self, element: T) -> None: …
- Eine neue Methode zur Definition von Typaliasen unter Verwendung des Expressions „type“ wurde bereitgestellt: type Point = tuple[float, float] type Point[T] = tuple[T, T]
- Im Modul typing wurde ein neuer Dekorator @override hinzugefügt, der die Typprüfungs-Systeme darüber informiert, dass die Methode im Unterklasse zum Überschreiben einer Methode oder eines Attributs in der Superklasse gedacht ist. Der Dekorator kann verwendet werden, um Fehler zu erkennen, die auftreten, wenn die zum Überschreiben vorgesehene Methode dies nicht tut. class Base: def log_status(self) -> None: … class Sub(Base): @override def log_status(self) -> None: # Ok, überschreibt Base.log_status … @override def done(self) -> None: # Das Typprüfungs-System wird einen Fehler erkennen …
- Um die Sicherheit zu verstärken, wurden die eingebauten Implementierungen der Algorithmen SHA1, SHA3, SHA2-384, SHA2-512 und MD5 in hashlib durch formal verifizierte Varianten des Projekts HACL* ersetzt (eingebaute Implementierungen werden nur verwendet, wenn OpenSSL nicht verfügbar ist).
- In CPython wurde ein Schutz gegen Stacküberlauf implementiert.
- Die Klasse pathlib.Path unterstützt jetzt Unterklassen.
- Im Modul os wurde die Unterstützung für die Plattform Windows erweitert. So wurde beispielsweise bei der Arbeit unter Windows die Unterstützung für die Methoden os.listdrives(), os.listvolumes() und os.listmounts() hinzugefügt, sowie die Genauigkeit von os.stat() und os.lstat() verbessert.
- In die Module sqlite3 und uuid wurden Befehlszeilen-Schnittstellen hinzugefügt („python -m sqlite3“ und „python -m uuid“).
- Die C-API unterstützt jetzt „unsterbliche“ Objekte, für die keine Referenzzählung angewendet wird.
- Das Konzept einer instabilen C API-Ebene wurde implementiert, die für Debugger, JIT-Compiler und andere Low-Level-Tools gedacht ist.
- Veraltete Funktionen wurden bereinigt.
- Die Module asynchat, asyncore, smtpd, imp und distutils wurden entfernt (das distutils-Modul kann aus dem setuptools-Paket verwendet werden).
- Die Eigenschaften wstr und wstr_length wurden aus der C-Implementierung von Unicode-Objekten entfernt.
- Veraltete Methoden im unittest-Modul wurden entfernt.
- Veraltete oder unschlüssige Funktionen, Klassen und Methoden wurden entfernt, einschließlich locale.format(), io.OpenWrapper, ssl.RAND_pseudo_bytes(), ElementTree.Element.copy(), hashlib.pbkdf2_hmac(), gzip.GzipFile usw.
- Im Modul webbrowser wurde die Unterstützung für alte Browser eingestellt, darunter Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird und Firefox bis Version 36.
- Im Rahmen der Vorbereitung auf künftige Optimierungen wurde die interne Darstellung von Ganzzahlen geändert.
Quelle: opennet.ru
