Python Attrs:geavanceerde gegevensklassen, met voorbeeldcode
Met het pakket Python Attrs kun je geavanceerde dataklassen maken met behulp van eenvoudige annotaties. Natuurlijk heeft python ook zijn eigen native dataklasse-module, maar het Python attrs-pakket biedt een aantal extra functies die je misschien leuk vindt!
Inhoudsopgave
Installeer attributen
Het attrs-pakket maakt geen deel uit van de basisbibliotheek, dus je moet het installeren met het pip install-commando of iets dergelijks, zoals Pipenv. U wilt waarschijnlijk ook een virtuele omgeving creëren, zodat deze andere projecten die u heeft niet hindert. Het pakket heet attrs, dus de installatie ziet er als volgt uit:
$ pip install attrs # or with pipenv: $ pipenv install attrs
Attrs versus dataklassen
De auteurs van attrs
hebben in feite gewerkt aan de PEP die dataklassen in Python introduceerde. De native dataklassen van Python zijn opzettelijk eenvoudiger en gemakkelijker te begrijpen gehouden, terwijl attrs het volledige scala aan functies bieden die u misschien wilt!
Enkele redenen om voor Python attrs
te kiezen over de ingebouwde dataklassen zijn:
- Je gebruikt een Python-versie van vóór 3.7. Attrs heeft u gedekt omdat het alle reguliere Python-versies ondersteunt, inclusief CPython 2.7 en PyPy.
- U wilt meer functies:attrs biedt validators en converters
- U wilt optimale prestaties en minimaal geheugengebruik met behulp van attrs-slotklassen
Een basisvoorbeeld van Python-attrs
Laten we eerst een heel eenvoudig voorbeeld bekijken:
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)
Een paar opmerkingen:
- De syntaxis is minder elegant en uitgebreider dan die van dataklassen, maar je krijgt er wel extra functies voor terug.
- Net als bij gegevensklassen krijgt u een mooi opgemaakte weergave van uw gegevens wanneer u deze afdrukt.
- Het attrs-pakket gebruikt slim gekozen namen zoals
attr.ib
, dus u hoeft alleen attr. U kunt ook de volledige namen importeren. Bijvoorbeeld metfrom attr import attrib, attrs
, en gebruik in plaats daarvan die namen. De functionaliteit is hetzelfde.
Laten we vervolgens eens kijken naar de belangrijkste functies die dit pakket biedt ten opzichte van reguliere dataklassen:validators en converters.
Python attrs validator voorbeeld
U kunt op twee manieren validators aan uw attrs-gegevensklasse toevoegen:
- Een decorateur gebruiken
- Door een oproepbare functie te bieden
Ik zal hier eerst de aanroepbare functiemethode demonstreren. Attrs biedt verschillende kant-en-klare validators, waarvan we de instance_of
. zullen gebruiken validator in het volgende voorbeeld:
>>> @attr.s ... class C(object): ... x = attr.ib(validator=attr.validators.instance_of(int)) >>> C(42) C(x=42) >>> C("a string") Traceback (most recent call last): ... TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...
Omdat we hebben geprobeerd een object C te maken met een tekenreekswaarde voor x, genereert de instantie_of validator een fout omdat het een int-type vereist in plaats van een tekenreeks.
Laten we nu onze eigen validator definiëren:
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} is not dividable by 2') print (DividableByTwo(60)) print (DividableByTwo(11)) # Output will be something like: # DividableByTwo(x=60) # ... # ValueError: 11 is not dividable by 2
Voorbeeld van Python attrs-converter
Een converter neemt de waarde die is ingesteld en converteert deze automatisch. Deze kun je voor allerlei doeleinden gebruiken. Een voorbeeld is het automatisch converteren van een waarde naar een int. Nogmaals, laten we beginnen met het gebruik van een aanroepbare functie, in dit geval gebruiken we gewoon de functie int() van Python:
import attr @attr.s class C(object): x = attr.ib(converter=int) c = C("1") print(c) # Output: # C(x=1)
Onze invoer (de string "1") werd automatisch geconverteerd naar een geheel getal. Omdat converters vóór validators worden uitgevoerd, kunt u de uiteindelijke waarde na conversie valideren. U kunt bijvoorbeeld de bovenstaande twee voorbeelden gebruiken om eerst elke invoer naar int te converteren en vervolgens te controleren of de waarde deelbaar is door twee.
Sleuven gebruiken met Python-attrs
Ten slotte kunt u attrs vertellen om sleuvenklassen te gebruiken. Ingelaste klassen hebben enkele voordelen ten opzichte van reguliere klassen:
- Ze hebben een kleine geheugenvoetafdruk
- Ze zijn sneller
Kortom, bij een slotted class geef je expliciet aan welke instance attributen je van je object instances verwacht. Op deze manier kan Python enkele controles en dergelijke weglaten, wat resulteert in minder geheugengebruik en lichte snelheidsverhogingen. U kunt hier meer details vinden in de attrs-documentatie.
Sleuvenklassen hebben echter ook kanttekeningen, vooral wanneer u ze handmatig maakt. Gelukkig biedt attrs ons een eenvoudige manier om de functie in te schakelen:
import attr @attr.s(slots=True) class YourClassName: ...
Blijf leren
- Ons artikel over Python-gegevensklassen
- Onze tutorial over Python-klassen en objecten
- Bekijk voor meer voorbeelden de pagina met attrs-voorbeelden
Python
- Python-gegevenstypen
- Python String strip() Functie met VOORBEELD
- Python String count() met VOORBEELDEN
- Python round() functie met VOORBEELDEN
- Python map() functie met VOORBEELDEN
- Python Timeit() met voorbeelden
- Python-teller in verzamelingen met voorbeeld
- Python time.sleep():voeg vertraging toe aan uw code (voorbeeld)
- Python List count() met VOORBEELDEN
- Python Lijst index() met Voorbeeld
- Python - Extensie programmeren met C