So geht modernes Python

24.06.2024
Von 
Serdar Yegulalp schreibt für unsere US-Schwesterpublikation Infoworld.
Lesen Sie, wie Ihr Python-Code von den aktuellsten und leistungsfähigsten Features der Sprache profitiert.
Python entwickelt sich mit jeder Version weiter. Wenn Ihre Applikationen in den Genuss der besten neuen Funktionen kommen sollen, sollten Sie diese vier Kernbereiche verinnerlichen.
Python entwickelt sich mit jeder Version weiter. Wenn Ihre Applikationen in den Genuss der besten neuen Funktionen kommen sollen, sollten Sie diese vier Kernbereiche verinnerlichen.
Foto: Heiko Kiera | shutterstock.com

Obwohl Python inzwischen bereits 33 Jahre auf dem Buckel hat, verbreitet sich die Programmiersprache erst seit einigen Jahren explosionsartig - und entwickelt sich beständig weiter. Dabei sind einige Features über den Lauf der Jahre unverändert geblieben und mit jeder neuen Python-Version einige neue hinzugekommen.

In diesem Artikel stellen wir Ihnen die wichtigsten Konzepte vor, die Sie durchdringen sollten, wenn Sie moderne Python-Anwendungen programmieren wollen, die sich die gewinnbringendsten Idiome, Konzepte und Funktionen der Programmiersprache zunutze machen. Die folgenden vier Bereiche sind besonders relevant, um das in der Praxis umzusetzen.

1. Type Hints

Die kürzlich in Python eingeführte Type-Hinting-Syntax ermöglicht den Einsatz von Linter- und Code-Quality-Tools von Drittanbietern. Diese durchforsten Ihren Code vor der Laufzeit auf mögliche Fehler. Je mehr Python-Code Sie erstellen und mit anderen teilen möchten, desto wahrscheinlicher ist es, dass Sie (und die, mit denen geteilt wird) davon profitieren, Type Hints zu verwenden. Da mit jeder neuen Python-Version raffiniertere und leistungsfähigere Type Annotations Einzug halten, tun Sie gut daran, sich regelmäßig mit dem Thema zu beschäftigen - auf lange Sicht haben Sie so weniger Schwierigkeiten, Schritt zu halten.

Wichtig ist in Sachen Type Hinting jedoch vor allem, dass es sich um ein optionales Feature handelt - das nicht jedes Python-Projekt zwingend benötigt. Sinn machen Type Hints insbesondere bei größeren Projekten - weniger im Fall von Wegwerfskripten, die aus 50 Codezeilen bestehen. Darüber hinaus werden Type Hints zur Runtime nicht erzwungen. Sie können dazu jedoch die Datenvalidierungs-Bibliothek Pydantic verwenden, die sich im Python-Umfeld bereits vielfach bewährt hat.

2. Virtuelle Umgebungen & Package Management

Für einfache Projekte und Dev-Aufgaben, die weniger anspruchsvoll sind, empfiehlt sich die Nutzung des Python-internen venv-Tools, um Projekte und Anforderungen getrennt zu halten. Die jüngsten Entwicklungsfortschritte in Sachen Python eröffnen allerdings weitere Möglichkeiten:

  • Wenn Sie mehrere Python-Versionen installieren müssen, um verschiedenen Projektanforderungen gerecht zu werden, ermöglicht es Ihnen Pyenv, wahlweise global oder projektspezifisch zwischen ihnen zu wechseln. Das ist insbesondere dann nützlich, wenn Sie häufig mit verschiedenen Python-Editionen direkt über die Kommandozeile arbeiten - außerhalb des Kontexts einer projektbezogenen, virtuellen Umgebung. Das Tool bietet offiziell keinen Support für Windows. Es existiert jedoch eine inoffizielle Windows-Portierung.

  • Um virtuelle Umgebungen sowie sämtliche Abhängigkeiten von Python-Projekten zu managen, empfiehlt sich Pipenv. Dieses Management-Tool stellt darüber hinaus sicher, dass die Abhängigkeiten deterministisch sind - Sie also genau die Version erhalten, die Sie wollen. Allerdings kommuniziert es in keiner Weise mit dem Packaging, weshalb Pipenv weniger gut für Projekte geeignet ist, die Sie über PyPI mit anderen teilen möchten.

  • Projekte bei PyPI bereitzustellen, geht mit Poetry leichter von der Hand. Dieses Tool erweitert Pipenv und managt darüber hinaus auch Projekte und Anforderungen sowie Virtual Environments (getrennt von Ihren Projektverzeichnissen).

  • Ein aktuelles Cutting-Edge-Projekt ist Python Development Master (PDM). Ähnlich wie Poetry und Pipenv bietet PDM ein singuläres Interface, um Projekte aufzusetzen, Abhängigkeiten zu managen und Distribution Artifacts zu erstellen. Darüber hinaus kommt bei diesem Tool auch der PEP-582-Standard zum Einsatz. Das gewährleistet, dass Packages für ein Projekt lokal gespeichert werden, wodurch es überflüssig wird, virtuelle Umgebungen für jedes einzelne Projekt zu kreieren.

  • Auch das Projekt Hatch verschreibt sich dem Thema Projekt-Setup und -Management. Allerdings stellt das Tool auch ein Build-System, Packaging-Tools für Redistributionszwecke sowie Test Handling und weitere nützliche Funktionen bereit.

  • Auch bei uv handelt es sich derzeit um ein experimentelles Projekt, das von den Machern des Linting-Tools ruff entwickelt wurde. Es zielt dabei darauf ab, pip, venv und andere Python-Befehlszeilen-Tools zu substituieren und ist für mehr Speed in Rust geschrieben. Dabei ist uv relativ einfach zu erlernen, weil es in Sachen Befehlsstruktur den Tools, die es ersetzen will, sehr ähnlich ist.

Wenn Sie neue Projekte erstellen, die in einer Teamumgebung bearbeitet oder an andere weitergegeben werden sollen (etwa über PyPI), sollten Sie das moderne pyproject.toml-Format für Ihre Anforderungen und die Projektkonfiguration sowie das damit verwendete Layout nutzen. Sie können trotzdem noch requirements.txt verwenden - pyproject.toml deckt jedoch einen größeren Use-Case-Bereich ab und macht Ihre Projekte zukunftskompatibel.

3. Neue Syntax

Nicht nur das Ökosystem von Python - auch die Sprache selbst entwickelt sich regelmäßig weiter. Das hat sich in den letzten Versionen der Programmiersprache insbesondere in neuen, syntaktischen Konstruktionen niedergeschlagen, die es ermöglichen, prägnanter und performanter zu programmieren.

Dabei sind drei neue Erweiterungen der Python-Syntax besonders erwähnenswert:

  • Structural Pattern Matching wurde mit Python 3.10 eingeführt und ist mehr als nur ein "switch/case für Python" (wie es manchmal beschrieben wird). Das Feature ermöglicht es Entwicklern, Control-Flow-Entscheidungen auf Basis der Contents oder der Structure von Objekten zu treffen. Mit anderen Worten: Es handelt sich um eine Matching-Option, die auf Types oder deren Shapes (eine Liste mit int und string beispielsweise) abstellt, statt auf Values.

  • Mit Python 3.8 hielt der sogenannte "Walrus Operator" Einzug, dessen Name Programm ist ((:=)). Diese Syntax-Ergänzung ermöglicht "Assignment Expressions" - eine Option, um einen Value einer Variablen zuzuordnen und letztere anschließend direkt zu testen. Das sorgt dafür, dass der resultierende Python-Code in diversen Situationen prägnanter ausfällt. Zum Beispiel, wenn der Rückgabewert einer Funktion überprüft wird und parallel die Ergebnisse erhalten bleiben sollen.

  • Eine kleinere, aber nicht weniger nützliche Ergänzung der Python-Syntax sind "Positional-Only Parameters". Diese ermöglichen es Entwicklern, anzugeben, welche Funktionsparameter als positional spezifiziert werden müssen. Auch diese Funktion ist im Allgemeinen dazu gedacht, Python-Projekte übersichtlicher zu gestalten und erleichternes, eine Codebasis zu entwickeln.

4. Testing

Geht es darum, Tests für Codebasen zu schreiben, verhält es sich ein bisschen wie mit der Nutzung von Zahnseide: Es besteht Einigkeit darüber, dass das sinnvoll ist. Trotzdem wenden es nur wenige regelmäßig an - richtig macht es eine noch kleinere Zahl. Das sollte sich - zumindest, wenn es um Testing geht - künftig ändern, denn die aktuellen Tools für Python in diesem Bereich machen es einfacher denn je, Test-Suiten aufzusetzen.

Dabei verfügt Python zwar über das integrierte Framework unittest - dieses ist allerdings mit Blick auf Design und Behaviors ziemlich altbacken. Als gängiger Ersatz hat sich das Framework Pytest etabliert, das im Vergleich deutlich flexibler ist (Sie können Tests für jeden Teil Ihres Codes deklarieren, nicht nur ein Subset) und außerdem weit weniger Boilerplate-Code erfordert. Die Funktionalitäten von Pytest lassen sich zudem über diverse Add-Ons erweitern - beispielsweise, um auch asynchronen Code zu testen.

Ein anderer wichtiger Testing-Aspekt ist die Code Coverage. Sie gibt Auskunft darüber, welchen Bereich der Codebasis die Tests tatsächlich abdecken. Das Coverage-Modul kann diese Anforderung abdecken - Pytest enthält ein entsprechendes Plugin. (fm)

Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.