Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

Python Attrs meistern: Fortgeschrittene Data Classes mit Praxisbeispielen erstellen

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:

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:

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:

  1. Per Dekorator
  2. 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:

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

Python

  1. Python-Datentypen meistern: Praxisleitfaden
  2. Pythons strip()-Methode meistern: Umfassender Leitfaden & Praxisbeispiele
  3. Pythons str.count(): Zeichen & Teilstrings zählen mit Beispielen
  4. Python round()-Funktion erklärt mit praktischen Beispielen
  5. Pythons map()-Funktion meistern: Syntax, Beispiele und Best Practices
  6. Python timeit(): Ausführungszeit messen mit praktischen Beispielen
  7. Python Counter in collections: Effizientes Zählen, Aktualisieren und arithmetische Operationen
  8. Python time.sleep(): Delays in Ihrem Code hinzufügen (Beispiel)
  9. Python list.count(): Experten-Guide mit praktischen Beispielen
  10. Python list.index(): Element-Positionen finden mit praktischen Beispielen