Python Attrs meistern: Fortgeschrittene Data Classes mit Praxisbeispielen erstellen
Das Paket Python Attrs ermöglicht, fortgeschrittene Data Classes mit einfachen Annotationen zu erstellen. Natürlich hat Python sein eigenes natives dataclass-Modul, aber attrs bietet ein paar Extra-Features, die Sie mögen könnten!
attrs installieren
Das attrs-Paket ist nicht Teil der Standardbibliothek, Sie müssen es via pip install oder Ähnlichem (z. B. Pipenv) installieren. Sie wollen wahrscheinlich eine virtuelle Umgebung, damit es nicht mit anderen Projekten interferiert. Paketname: attrs:
$ pip install attrs # oder mit pipenv: $ pipenv install attrs
Attrs vs. Data Classes
Die Autoren von attrs haben tatsächlich an dem PEP mitgearbeitet, der Data Classes in Python einführte. Pythons native Data Classes sind absichtlich simpler und leichter verständlich gehalten, während attrs den vollen Funktionsumfang bietet!
Gründe für attrs statt eingebauter Data Classes:
- Python-Version vor 3.7.
attrsunterstützt alle Mainstream-Versionen, inkl. CPython 2.7 und PyPy. - Mehr Features gewünscht:
attrsbietet Validatoren und Konverter. - Optimale Performance und minimaler Speicherverbrauch via
attrsslotted classes.
Einfaches Python attrs Beispiel
Sehen wir uns ein grundlegendes Beispiel an:
import attr
@attr.s
class Person(object):
name = attr.ib(default='John')
surname = attr.ib(default='Doe')
age = attr.ib(init=False)
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)
# Output:
# Person(name='John', surname='Doe', age=NOTHING)
# Person(name='Bill', surname='Gates', age=60)
Ein paar Beobachtungen:
- Syntax ist weniger elegant und etwas verboser als bei Data Classes, aber Sie erhalten Extra-Features dafür.
- Ähnlich wie Data Classes erhalten Sie eine schön formatierte Repräsentation beim Drucken.
attrsnutzt geschickt gewählte Namen wieattr.ib, Sie müssen nurattrimportieren. Alternativ volle Namen:from attr import attrib, attrs. Funktion identisch.
Nun die wichtigsten Features, die attrs über normale Data Classes bietet: Validatoren und Konverter.
Python attrs Validator Beispiel
Validatoren lassen sich auf zwei Arten zu attrs-Data-Classes hinzufügen:
- Per Dekorator
- Durch Bereitstellung einer aufrufbaren Funktion
Ich demonstriere hier zuerst die Callable-Function-Methode. attrs bietet mehrere Validatoren out-of-the-box, wir nutzen instance_of:
>>> @attr.s
... class C(object):
... x = attr.ib(validator=attr.validators.instance_of(int))
>>> C(42)
C(x=42)
>>> C("ein string")
Traceback (most recent call last):
...
TypeError: ("'x' muss <type 'int'> sein (got 'ein string' das ist <type 'str'>).", ...
Da wir versuchten, ein Objekt C mit String-Wert für x zu erstellen, wirft der instance_of-Validator einen Fehler, weil er int verlangt, nicht str.
Definieren wir nun unseren eigenen Validator:
import attr
@attr.s
class DividableByTwo(object):
x = attr.ib()
@x.validator
def check(self, attribute, value):
if value % 2 != 0:
raise ValueError(f'{value} ist nicht durch 2 teilbar')
print(DividableByTwo(60))
print(DividableByTwo(11))
# Output etwa:
# DividableByTwo(x=60)
# ...
# ValueError: 11 ist nicht durch 2 teilbar
Python attrs Converter Beispiel
Ein Converter nimmt den gesetzten Wert und wandelt ihn automatisch um. Nutzbar für allerlei Zwecke. Beispiel: Automatische Konvertierung zu int. Wieder mit Callable Function, hier Pythons int():
import attr
@attr.s
class C(object):
x = attr.ib(converter=int)
c = C("1")
print(c)
# Output:
# C(x=1)
Unser Input (String „1“) wurde automatisch zu Integer konvertiert. Da Konverter vor Validatoren laufen, können Sie den finalen Wert nach Konvertierung validieren. Z. B. die obigen Beispiele kombinieren: Erst jeden Input zu int konvertieren, dann prüfen, ob Wert durch zwei teilbar.
Slots mit Python attrs nutzen
Schließlich können Sie attrs anweisen, slotted Classes zu nutzen. Slotted Classes haben Vorteile gegenüber normalen Klassen:
- Kleinerer Memory Footprint
- Schneller
Kurz: Bei slotted Classes geben Sie explizit an, welche Instanzattribute Ihre Objekte haben sollen. Python spart sich Checks etc. – weniger Speicher, leichte Speed-Steigerung. Details in der attrs-Doku.
Slotted Classes haben aber auch Fallstricke, besonders bei manueller Erstellung. Glücklicherweise bietet attrs einen einfachen Weg, das Feature zu aktivieren:
import attr
@attr.s(slots=True)
class YourClassName:
...
Weiterlernen
- Unser Artikel zu Python Data Classes
- Unser Tutorial zu Python Klassen und Objekten
- Für mehr Beispiele: attrs Examples Page
Python
- Python-Datentypen meistern: Praxisleitfaden
- Pythons strip()-Methode meistern: Umfassender Leitfaden & Praxisbeispiele
- Pythons str.count(): Zeichen & Teilstrings zählen mit Beispielen
- Python round()-Funktion erklärt mit praktischen Beispielen
- Pythons map()-Funktion meistern: Syntax, Beispiele und Best Practices
- Python timeit(): Ausführungszeit messen mit praktischen Beispielen
- Python Counter in collections: Effizientes Zählen, Aktualisieren und arithmetische Operationen
- Python time.sleep(): Delays in Ihrem Code hinzufügen (Beispiel)
- Python list.count(): Experten-Guide mit praktischen Beispielen
- Python list.index(): Element-Positionen finden mit praktischen Beispielen