Python 3.7 – Ausbau der Autobahn

Das jüngste Release der Programmiersprache bringt zahlreiche nützliche Ergänzungen.

In Pocket speichern vorlesen Druckansicht 16 Kommentare lesen
Python 3.7 – Ausbau der Autobahn
Lesezeit: 8 Min.
Von
  • Gerhard Völkl
Inhaltsverzeichnis

Für den 27. Juni hat die Python Software Foundation die neue Version 3.7 der Programmiersprache Python angekündigt. Betas oder Release-Kandidaten kann jeder seit einiger Zeit zum Herumprobieren herunterladen.

Einer der Gründerväter von Python, Guido van Rossum, hat auf einem Vortrag die Weiterentwicklung einer Programmiersprache treffend mit dem Ausbau einer Autobahn verglichen: Alte Fahrbahnen werden gesperrt, neue eingezogen, und irgendwann läuft es dann besser – bis die nächste Änderung ansteht.

Diese evolutionäre Strategie ist an der Version 3.7 erkennbar. Manches hat sich geändert, und interessante Dinge wie Data Classes oder breakpoint sind hinzugekommen. Bei den beschriebenen Neuerungen ist jeweils die PEP-Nummer (Python Enhancement Proposal) angegeben, unter der auf Python.org ausführlichere Informationen zu finden sind.

Hinter dem Begriff Data Classes stecken von der Syntax her reguläre Klassen in Python. Sie unterscheiden sich von anderen Klassen lediglich in ihrer Anwendung. Sie sind vor allem dafür gedacht, Daten zu speichern und weniger, um große Berechnungen auszuführen oder Algorithmen zur Verfügung zu stellen.

Ein klassisches Beispiel für Data Classes wäre das Verwalten der Produkte, die man in einem Supermarkt findet.

class Product:
name: str
preis: float
anzahl: int = 0

def __init__(self, name:str,
preis:float, anzahl: int=0) -> None:
self.name = name
self.preis = preis
self.anzahl = anzahl

def gesamt_wert(self) -> float:
return self.preis * self.anzahl

def __repr__(self) -> str:
return 'Produkt Name={} Preis={} Anzahl={}'
.format(self.name,self.preis,self.anzahl)

def __hash__(self) -> int:
return hash(self.name) ^ hash(self.preis) ^
hash(self.anzahl)

def __eq__(self, other) -> bool:
return ((self.name, self.preis, self.anzahl) ==
(other.name, other.preis, other.anzahl))

Solche Klassen komplett zu erstellen, erfordert viel Drumherum – vor allem bei den Magic Methods, die in Python mit "__" beginnen. Die Methode __init__ zum Initialisieren eines neuen Objekts braucht man immer. Soll es als Schlüssel in einem Dictionary oder als Teil eines Set dienen, ist die Methode __hash__ notwendig. Außerdem gibt es noch __repr__ für eine sinnvolle Ausgabe oder __eq__ zum Vergleichen und vieles mehr.

Mit dem neuen Klassen-Decorator dataclass geht das deutlich einfacher:

from dataclasses import dataclass

@dataclass()
class Product:
name: str
preis: float
anzahl: int = 0

def gesamt_wert(self) -> float:
return self.preis * self.anzahl

Der Decorator dataclass ist im neuen Modul "dataclasses" zu finden, das als Standardbibliothek in Python 3.7 enthalten ist. Die Angabe zu den verwendeten Datentypen (Type Hinting) ist notwendig. Wenn sie fehlt, ignoriert der Decorator das entsprechende Feld.

Welche Magic Methods der Decorator intern erzeugt, lässt sich über dessen Parameter steuern:

@dataclass(init=True, repr=True, eq=True, order=False, frozen=False)

Ist True angegeben, erzeugt er die zugehörigen Methoden. Darüber hinaus existieren speziellere Parameter wie frozen. Wenn er den Wert True hat, sind die Felder nur lesbar. Zum Erweitern der Methode __init__ dient die zusätzliche Methode __post_init__. In ihr können Entwickler eigenen Quelltext unterbringen.

Die neuen Data Classes sind inspiriert vom Projekt attrs: Classes Without Boilerplate, das versucht, Klassendefinitionen von verwirrenden Programmzeilen zu befreien.