Kurz notiert: nach knapp einem Jahr hat die Python Foundation wieder eine neuen Minor-Release (Version 3.8) der bekannten Programmiersprache Python veröffentlicht. Dieser Release ist der erste Minor-Release, der aus der Zeit nach van Rossum als BDFL (siehe Bericht) stammt und umfasst eben jene PEP 572, dessen Diskussion ihn zum Rückzug aus der Position veranlasst hatte.
Assignment expressions
Die PEP 572 führt die sog. Assignment expressions ein. Mit diesen Ausdrücken wird es möglich, Zuweisungen direkt in Ausdrücken vorzunehmen und ein C-ähnliches Verhalten wie bei while(line = buffer.read())
darzustellen. Konkret wird in der PEP 572 erwähnt, dass besonders regex-Ausdrücke wie
match = re.match(data)
group = match.group(1) if match else None
die von Programmierern gerne zu
group = re.match(data).group(1) if re.match(data) else None
zusammengekürzt werden, damit vereinfacht und beschelunigt werden sollen, da in letzterem Beispiel für den Oneliner doppelter Berechnungsauswand durch den zweifachen re.match()-Aufruf notwendig wird.
Mit den neuen Assignment expressions soll das dann so aussehen dürfen:
group = match.group(1) if (match := re.match(data)) else None
Positional-only arguments
Die weiteren Änderungen sind besonders aus API-Sicht interessant. Eventuell ist dem ein oder anderen schon aufgefallen, dass die built-in function pow() etwas komisch auf keyword-args reagiert. help(pow)
zeigt zwar, dass es die required Parameter x und y gibt. Ruft man aber statt z.B. pow(2, 4)
direkt per pow(x=2, x=4)
auf, fliegt ein TypeError: pow() takes no keyword arguments. Dies geht u.a. darauf zurück, dass pow die dazugehörige C-Funktion direkt anspricht und dieser TypeError sicherstellt, dass die Argumentübergabe ordnungsgemäß funktioniert, da C keine keyword arguments kennt und Python somit nicht weiß, wie herum die Argumente nun gedreht werden sollen.
Diese Funktionalität steht nun allen Entwicklern zur Verfügung:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
In diesem Beispiel müssen die Parameter a und b zwingend als positional arguments (d.h. in der Reihenfolge und ohne keyword-Angaben) übergeben werden. c und d können als positional oder keyword arguments übergeben werden und e und f müssen als keyword arguments übergeben werden. Letzteres ist bisher schon üblich, da z.B. mit dem Parameter *args
alle restlichen positional arguments (d.h. ohne keywords) über als Liste mit dem Namen args der Funktion zur Verfügung stehen.
Python Initialization Configuration
Mit der PEP 587 wird eine neue C API eingeführt, die feiner granulierterere Möglichkeiten zur Einstellung des Initialisierungsprozessses und eine verbesserte Fehlerrückgabe ermöglichen. Einen guten Überblick über die konkreten Funktionen, die für C-Entwickler nun zur Verfügung stehen, ist in den Docs abrufbar.
Weitere Änderungen
Weiterhin steht nun die verbesserte Protokollversion 5 von pickle zur Verfügung. Darüberhinaus floss eine ganze Reihe von verschiedenen Verbesserungen oder Änderungen in den neuen Release ein. So dürfen continue
Anweisungen nun in finally
-Blöcken stehen oder dicts in Form des TypedDict mit Typen annotiert werden.
Das gesamte Changelog ist hier abrufbar, die neue Version kann ab sofort hier oder demnächst im Paketmanager des Distributors bezogen werden.
Weiterhin sei an dieser Stelle nochmals erwähnt, dass der Python 2-Support Ende des Jahres ausläuft. Auch diese neue Version ist ein Einreiz für einen Umstieg von Version 2 auf 3.