Python 3.8 vereinheitlicht Konfiguration der Initialisierung

Neben einer neuen API für die Konfiguration bekommt die Programmiersprache Assignment Expressions und positionsabhängige Parameter.

In Pocket speichern vorlesen Druckansicht 15 Kommentare lesen
Python 3.8 vereinheitlich die Konfiguration der Initialisierung
Lesezeit: 6 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Das Python-Team hat die erste Beta von Python 3.8 veröffentlicht. Zu den Neuerungen gehört eine verbesserte C-API zum Konfigurieren der Initialisierung. Außerdem bekommt die Programmiersprache Assignment Expressions und eine Syntax für rein positionsabhängige Parameter. Die kommende Version der Programmiersprache gilt mit der Veröffentlichung der ersten Beta als Feature Complete, auch wenn noch Änderungen beziehungsweise Anpassungen der neuen Funktionen möglich sind oder sie in Ausnahmefällen doch entfallen können.

Das PEP 587 (Python Enhancement Proposal) sieht eine neue C-API zum Konfigurieren von Python beim Initialisieren vor. Die bisherigen Möglichkeiten zur Konfiguration sind uneinheitlich gestaltet und über unterschiedliche Wege erreichbar. Als Beispiele nennt das PEP globale Konfigurationsvariablen wie Py_IsolatedFlag, Umgebungsvariablen wie PYTHONPATH, Kommandozeilenparameter wie -b und Funktionsaufrufe wie Py_setProgramName(). Einige Parameter lassen sich außerdem über die bisherige C-API nur schwer oder gar nicht konfigurieren.

Python 3.8 bietet in der neuen API nun die Strukturen PyConfig, PyPreConfig, PyStatus und PyWideStringList, die einheitliche Funktionen zum Setzen einzelner Parameter und dem Lesen und Löschen der Konfiguration aufweisen. Entwickler können berechnete Parameter auslesen und überschreiben, bevor sie die Konfiguration anwenden.

Neu ist zudem die Option, über PyPreConfig_InitIsolatedConfig() und PyConfig_InitIsolatedConfig() eine vom System isolierte Konfiguration zu erstellen, die globale Konfigurations- und Umgebungsvariablen ebenso ignoriert wie Kommandozeilenparameter.

PEP 572 führt die bisher in Python nicht vorgesehenen Assignment Expressions ein, mit denen sich die Python-Expressions wie Berechnungen einer Variable zuweisen und im folgenden Code verwenden lassen. Damit soll der Code gleichzeitig kompakter werden und wiederholte Berechnungen vermeiden. Die Syntax ist NAME := expr, wobei Letzteres ein nahezu beliebiger Ausdruck ist – Ausnahme sind nicht eingeklammerte Tupel. Als Beispiele führt das PEP unter anderem die Verarbeitung eines regulären Ausdrucks und eine Schleife zum Lesen aus einer Datei an:

# Handle a matched regex

if (match := pattern.search(data)) is not None:
# Do something with match

# A loop that can't be trivially rewritten using 2-arg iter()

while chunk := file.read(8192):
process(chunk)

Für mehr Klarheit müssen die Assignment Statements an einigen Stellen in Klammern stehen, wobei das PEP bei den genannten Beispielen vom Einsatz abrät, da er entweder nicht sinnvoll oder sogar verwirrend sein kann, wie in folgendem Beispiel:

foo(x = y := f(x))  # INVALID
foo(x=(y := f(x))) # Valid, though probably confusing

Assignment Expressions sind nicht überall an Stellen erlaubt, an denen Assignment Statements stehen dürfen. So lassen sich nicht mehrere Ziele in Kurzform zuweisen, allerdings ist die Zuweisung durch das Setzen von Klammern möglich:

x = y = z = 0  # Equivalent: (z := (y := (x := 0)))

Für Zuweisungen wie a[i] = x existieren keine entsprechenden Assignment Expressions, und Operatoren wie += lassen sich nicht verwenden.

Das PEP 570 führt eine neue Syntax für Funktionen mit rein positionsbestimmten Parametern ein (Positional-only Parameters). Wie der Name vermuten lässt, bestimmt dabei die Position die Zuweisung an den jeweiligen Parameter, und ihre namentliche Festlegung ist nicht erlaubt.

Auch wenn das Proposal eine neue Syntax definiert, existieren die Positional-only Parameter bereits in builtin-Funktionen von CPython wie in pow(x, y[,z]). Ein Aufruf mit Parameternamen führt zu einem TypeError, wie das Beispiel aus dem PEP aufführt:

>>> pow(x=5, y=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pow() takes no keyword arguments

Die im PEP 570 vorgeschlagene Syntax erweitert die bisherige und ist damit vollständig rückwärtskompatibel. Die rein positionsbestimmten Parameter können am Anfang einer Parameterliste stehen, und ihnen folgt ein / zur Kennzeichnung. Anschließend dürfen zunächst positions- oder Keyword-bestimmte Parameter und nach dem trennenden * am Schluss rein Keyword-bestimmte Parameter folgen:

def name(positional_only_parameters, /, 
positional_or_keyword_parameters, *,
keyword_only_parameters):

Die über Keyword definierten Parameter dürfen weiterhin optional sein. Falls ein Position-only Parameter einen Standardwert bekommt, müssen die anschließenden über Position oder Keyword bestimmten ebenfalls Default-Werte aufweisen, die rein über Keyword definierten dürfen freilich ohne auskommen:

def name(p1, p2=None, /, p_or_kw=None, *, kw):

Weitere Proposals, die in die Python 3.8 Beta eingeflossen sind, sind das PEP 590 mit einem sogenannten vectorcall-Protokoll, einer C-API, die den Aufruf von Objekten optimieren soll, PEP 578 mit zwei APIs, die Test- beziehungsweise Logging-Frameworks und Security-Tools Einblick in eine laufende Python-Anwendung geben soll sowie PEP 574 für ein neues Pickle-Protokoll zur Serialisierung von Objekten. Daneben gibt es einige Ergänzungen der Syntax. Unter anderem ist nun continue in finally:-Blöcken erlaubt. Auch unter der Haube gibt es einige Ergänzungen und Optimierungen.

Für Entwickler, die bereits auf Python 3.x setzen, sind die Neuerungen von Python 3.8 nette Ergänzungen. Für diejenigen, die nach wie vor Python 2.x verwenden, läuft die Zeit langsam ab: Ende des Jahres endet der Support, womit Python 2 End of Life erreicht. Ein Artikel auf heise Developer gibt einen Überblick über die notwendigen Aufräumarbeiten sowie die Ergänzungen und Änderungen in Python 3.x gegenüber Python 2.x.

Weitere Details zur Beta von Python 3.8 lassen sich der offiziellen Ankündigung entnehmen. Die Veröffentlichung der finalen Variante ist laut dem unter PEP 569 geführten Release Schedule für den 21. Oktober geplant. Der erste Release Candidate soll am 30. September erscheinen. (rme)