Python 3.12 hat Performance, klare Syntax und präzisere Fehlermeldungen im Fokus

Neben Optimierungen unter der Haube passt die Beta von Python 3.12 unter anderem die Syntax für F-Strings und generische Klassen und Typen an.

In Pocket speichern vorlesen Druckansicht 45 Kommentare lesen

(Bild: Funtap / Shutterstock.com)

Lesezeit: 3 Min.
Inhaltsverzeichnis

Die Python Software Foundation hat die erste Beta von Python 3.12 veröffentlicht. Die Programmiersprache bringt in der frischen Version einige syntaktische Ergänzungen unter anderem für generische Klassen, Funktionen und Typ-Aliase sowie für F-Strings mit. Daneben gibt es Anpassungen, die auf eine bessere Performance zielen, und Verbesserungen bei den Fehlermeldungen.

Mit der ersten Beta gilt Python 3.12 als Feature Complete, neue Funktionen sind also nicht mehr zu erwarten. Der Release-Fahrplan für Python 3.12 sieht drei weitere Betas und zwei Release Candidates vor, bevor am 2. Oktober das endgültige Release erscheinen soll.

Formatierte String-Literale oder F-Strings kennt Python seit Version 3.6. Sie erlauben es, auf einfache Weise Ausdrücke in Strings zu integrieren und so beispielsweise Variablen direkt einzubinden. Allerdings verzichtete das ursprüngliche Python Enhancement Proposal PEP 498 auf formelle syntaktische Vorgaben und bringt einige Einschränkungen mit. So ist beispielsweise bei einem String, der mit einfachen Anführungszeichen (') begrenzt ist, kein (') innerhalb der Ausdrücke erlaubt. Das in Python 3.12 aufgenommene PEP 701 formalisiert nun die Syntax für F-Strings und erweitert damit die Einsatzmöglichkeiten.

Auch für generische Typ-Aliase, Funktionen und Klassen bietet Python 3.12 eine neue, übersichtlichere Syntax, die sich an anderen Programmiersprachen orientiert. Das zugehörige PEP 695 vergleicht die alte mit der neuen Schreibweise für generische Klassen:

# bisherige Schreibweise
from typing import Generic, TypeVar

_T_co = TypeVar("_T_co", covariant=True, bound=str)

class ClassA(Generic[_T_co]):
    def method1(self) -> _T_co:
        ...
        
# ab Python 3.12
class ClassA[T: str]:
    def method1(self) -> T:
        ...

Zu den Ergänzungen, die die Performance verbessern sollen, gehört unter anderem das PEP 709, das Comprehensions, also gefilterte Kopien von Listen, Dictionaries und Sets, intern anders umsetzt. Bisher hat Python dafür verschachtelte Funktionen genutzt. Ab Version 3.12 setzt es stattdessen auf Inlining. Damit sollen die einzelnen Comprehensions im Optimalfall doppelt so schnell arbeiten, und das Proposal spricht von einer Performance-Verbesserung einer realen Anwendung mit vielen Comprehensions um 11 Prozent.

Aussagekräftige Fehlermeldungen standen bereits in Version 3.11 im Fokus. Seinerzeit sorgte das PEP 657 dafür, dass der Python-Interpreter bei Tracebacks den exakten Ausdruck anzeigt, in dem ein Fehler auftritt. Zuvor hatte er lediglich die zugehörige Zeilennummer ausgespuckt. In Python 3.12 geben Fehlermeldungen unter anderem potenziell fehlende Importanweisungen für Module als Ursache für einen NameError an:

sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?

Daneben gibt es Hinweise auf womöglich vertauschte Zuordnungen, wenn im Code import foo from bar statt from bar import foo steht.

Eine Neuerung beschäftigt die Python-Community bereits seit längerer Zeit: ein Weg aus der Falle des Global Interpreter Lock (GIL). Er schränkt nebenläufige Programme ein, weil alle Python-Interpreter demselben globalen Lock unterworfen sind. PEP 684 erlaubt es, Sub-Interpreter zu erstellen, die unabhängige Locks haben.

Das verwandte und fünf Jahre ältere PEP 554 für mehrere Interpreter in der Standard-Library über ein interpreters-Modul ist dagegen erst für den Start in der kommenden Version 3.13 markiert.

Zu den weiteren nennenswerten Neuerungen in Python 3.12 gehört, dass unter Linux der Profiler perf neuerdings die Namen der Python-Funktionen in Traces ausgibt. Außerdem fallen zahlreiche als überholt (deprecated) gekennzeichnete Features im aktuellen Release heraus.

Weitere Details finden sich in dem Blogbeitrag zur ersten Beta. Die vollständige Liste der Änderungen ist im Changelog zu finden. (rme)