Auf Github ist Python erstmals populärer als Java; selbst Python 2 scheint noch mehr Fans zu haben, als den Distributionen lieb ist. Daneben steht ein neuer Release-Zyklus ins Haus, und Python 3.8 bringt Neuerungen mit. Zeit für einen Überblick.
Unter dem Motto “State of the Octoverse” [1] veröffentlichen die Github-Betreiber jährlich eine Handvoll statistischer Daten. Weil Github mit 44 Millionen Repositories und 40 Millionen angemeldeten Benutzern das größte Online-Software-Repository der Welt ist, kommt auch den Zahlen zu den Programmiersprachen in den dort gehosteten Projekten eine gewisse Relevanz zu.
Dabei gab es dieses Jahr ein Novum: Python überholte Java und ist nun – nach Javascript – die zweitpopulärste Programmiersprache unter den Github-Projekten. Die Verfasser der Statistik sehen vor allem Datenwissenschaftler und Hobbyisten hinter dem Wachstum von Python. So seien für Data Scientists einige Kernpakete in Python verfasst, die als Grundlage von Projekten in der Wissenschaft und in Unternehmen dienen.
Auch in den Bereichen Deep Learning, Machine Learning und Natural Language Processing kommt Python laut Github im großen Stil zum Einsatz. So steckt NumPy in mehr als der Hälfte jener Repositories, die sich mit den genannten Themen beschäftigen. Viele dieser Projekte hängen zudem von SciPy, Scikit-learn oder Tensorflow ab, die ebenfalls Python verwenden. Nicht zuletzt erfreut sich auch Jupyter Notebooks [2] großer Popularität unter Wissenschaftlern, die Programmierprojekte betreiben.
Pythons Altlasten
Dass die Popularität von Python historisch gewachsen ist, verdeutlicht vor allem die Tatsache, dass sich Linux-Distributionen noch immer sehr schwer tun, die Python-2-Abhängigkeiten aus ihren Software-Repositories zu werfen.
Das Python-Projekt selbst will den Support für Python 2 ab 2020 einstellen. Auch Debian “Bullseye” will daher eigentlich keine Python-2-Pakete mehr anbieten. Doch inzwischen zielt das Debian-Projekt darauf ab, zumindest “so viele Python-2-Pakete wie möglich” zu entfernen [3]. In einer E-Mail vom 11. November 2019 ist von rund 3300 Python-2-bezogenen Bugs die Rede, immerhin 1500 davon seien inzwischen geschlossen.
Die Entwickler wollen nun die Daumenschrauben etwas anziehen: Nicht nur erhöhen sie die damit verbundenen Bugs auf den Level »Serious«; wer seine Python-2-Software unbedingt weiter in Debian sehen möchte, soll sie mit »py2keep« taggen und eine Begründung an die Mailingliste schicken.
Auch Ubuntu schlägt sich mit Python-2-Altlasten herum. Wie Matthias Klose auf der Mailingliste feststellte [4], habe das Ubuntu-Projekt selbst einige Python-2-Pakete beigesteuert. Dass deren Macher die Pakete aber bis zum Release der nächsten LTS-Version (“Focal Fossa”) umschreiben, scheint eher unwahrscheinlich, läuft doch die Konvertierung im Projekt bereits seit Jahren. Wer den Code bis jetzt nicht umgeschrieben hat, tut es womöglich nimmermehr.
Python 3.8 ist da
Sehr viel besser sieht es dagegen mit dem Support für Python 3 aus. Die im April 2020 erscheinende LTS-Version von Ubuntu wird unter anderem das kürzlich veröffentlichte Python 3.8 unterstützen. Das bringt neben dem Walrus-Operator Verbesserungen mit, die es kompatibler für Embedded-Systeme und die Programmiersprache C machen.
Dank einer neuen Funktionsparametersyntax lassen sich bestimmte Parameter ausschließlich als Schlüsselworte oder positional verwenden. Man kann ihnen also keine neuen Werte zuweisen, wie ein Beispiel aus den Release Notes zu Python 3.8 [5] zeigt, das Listing 1 aufgreift. Dort sind »a« und »b« rein positional, »c« und »d« dürfen wahlweise positional oder Keywords sein, und »e« und »f« müssen Keywords sein. Was aufgrund dieser Schreibweise nun nicht mehr geht, zeigt die Ankündigung ebenfalls (Listing 2).
Listing 1
Positionale und Keywords
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
Listing 2
Geänderte Funktionsparameter
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
Ein großer Vorteil dieser Änderungen, die das PEP 570 im Detail beschreibt, besteht darin, dass pure Python-Funktionen nun C-Funktionen komplett emulieren können. Ebenfalls neu sind die mit PEP 578 [6] eingeführten Runtime Audit und Verified Open Hooks. Dazu gehören neue C-APIs, die es Embedded-Entwicklern und C-Python-Implementierern erlauben, Audit Hook Messages zu senden und zu empfangen. Zugleich empfängt und generiert Python dank neuer APIs Audit Hooks.
Eine weitere Optimierung, die auch C betrifft, ist ein neues C-API, um die Python-Initialisierung einzurichten. Dazu erhält Python 3.8 vier neue Strukturen und mehr als 20 Funktionen, die insgesamt eine feinere Kontrolle über die Konfiguration erlauben und bessere Fehlerberichte ermöglichen. Mehr dazu steht im PEP 587.
Walross an Bord
Beim Walrus-Operator handelt es sich um einen neuen Assignment-Ausdruck, der die Komplexität des Codes in bestimmten Fällen reduzieren und dessen Lesbarkeit erhöhen möchte. Er lässt sich zum Beispiel in einer If-Konstruktion einsetzen, wenn eine Funktion eigentlich doppelt aufgerufen werden müsste. Im Beispiel von Listing 3 wäre das die »len()«-Funktion. Auch in Fällen, in denen Entwickler ein Objekt in doppelter Ausführung benötigen, erweist sich der Walrus-Operator als nützlich.
Listing 3
len() mit Walrus-Operator
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
Pickle hilft dabei, in Multicore- und Multimaschinen-Setups mit Python große Datenmengen zwischen Prozessen zu transferieren. Das Pickle-Protokoll führt in Version 5 nun sogenannte Out-of-Band-Datenpuffer ein. Die erlauben es, mit PEP 3118 kompatible Daten separat vom hauptsächlichen Pickle-Stream zu transferieren. Nicht zuletzt lässt sich über »PYTHONPYCACHEPREFIX« der Dateicache auf selbst gewählten Dateisystemen unterbringen.
Release-Beschleuniger
Zudem haben die Python-Entwickler nun beschlossen, den bisherigen auf grob 18 Monate ausgelegten Release-Zyklus auf ein festes 12-Monats-Intervall umzustellen (Abbildung 1). Ein neues Python soll es dann stets im Oktober eines Jahres geben, heißt es im zugehörigen PEP 602.

Abbildung 1: Den geplanten neue Release-Zyklus für Python stellt PEP 602 auch grafisch dar. Quelle: www.python.org
Die Python-Versionen sollen dann fünf Jahre lang Support erhalten – ein Jahr vollen Support, vier Jahre lang Sicherheitsaktualisierungen. Die anstehende Version Python 3.x.0 soll noch 17 Monate Reifezeit bekommen. Dann beginnt der 12-Monats-Zyklus für die Major-Releases von Python.
Die Entwickler hoffen, dass dank des kürzeren Zyklus Bugfixes und Features schneller beim Nutzer ankommen. Außerdem sollen die Releases schlanker werden: Die Verkürzung der Zeit bedeute nicht, dass sich mehr Entwickler mit einer Version befassen. Das vereinfache auch in der Folge den Aktualisierungsvorgang für die Nutzer, weil es weniger Änderungen gebe. Daneben sei ein kürzerer Zyklus auch für Entwickler ein Vorteil: Sie müssten nun nicht mehr kurz vor Torschluss bei der Beta in Hektik verfallen, um ihre neuen Features unterzubringen, die sonst lange auf Halde lägen.
Infos
-
“State of the Octoverse”: https://octoverse.github.com
-
Jupyter: Parul Pandey, “Datenlabor”, LM 05/2019, S. 28, https://www.linux-magazin.de/42726
-
Debian und Python 2: https://lists.debian.org/debian-devel-announce/2019/11/msg00000.html
-
Ubuntu und Python 2: https://lists.ubuntu.com/archives/ubuntu-devel/2019-November/040842.html
-
Python 3.8: https://docs.python.org/3.8/whatsnew/3.8.html
-
PEP-Übersicht: https://www.python.org/dev/peps/






