Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Python Attrs meesteren: geavanceerde data classes bouwen met praktische voorbeelden

Python Attrs meesteren: geavanceerde data classes bouwen met praktische voorbeelden

Het pakket Python Attrs stelt u in staat om geavanceerde data classes te maken met behulp van eenvoudige annotaties. Natuurlijk heeft Python zijn eigen ingebouwde data class module ook, maar het Python attrs-pakket biedt een paar extra features die u misschien leuk vindt!

Attrs installeren

Het attrs-pakket maakt niet deel uit van de standaardbibliotheek, dus u moet het installeren met het pip install-commando of iets dergelijks, zoals Pipenv. Waarschijnlijk wilt u ook een virtuele omgeving aanmaken, zodat het niet interfereren met andere projecten die u heeft. Het pakket heet attrs, dus installeren ziet er zo uit:

$ pip install attrs # of met pipenv: $ pipenv install attrs

Attrs vs data classes

De auteurs van attrs hebben in feite gewerkt aan de PEP die data classes in Python introduceerde. Python's ingebouwde data classes zijn bewust eenvoudiger en begrijpelijker gehouden, terwijl attrs de volledige reeks features biedt die u misschien wilt!

Enkele redenen om Python attrs te kiezen boven de ingebouwde data classes:

  • U gebruikt een Python-versie voor 3.7. Attrs heeft u gedekt omdat het alle mainstream Python-versies ondersteunt, inclusief CPython 2.7 en PyPy.
  • U wilt meer features: attrs biedt validators en converters
  • U wilt optimale prestaties en minimaal geheugengebruik met attrs geslotten klassen

Een basis Python attrs voorbeeld

Laten we eerst naar een heel basis voorbeeld kijken:

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 observaties:

  • De syntaxis is minder elegant en meer verbose dan die van data classes, maar u krijgt extra features terug.
  • Vergelijkbaar met data classes, krijgt u een netjes geformatteerde representatie van uw data wanneer u het print.
  • Het attrs-pakket gebruikt slim gekozen namen zoals attr.ib, dus u hoeft alleen attr te importeren. U kunt alternativelijk de volledige namen importeren. Bijvoorbeeld met from attr import attrib, attrs, en die namen gebruiken. De functionaliteit is hetzelfde.

Laten we nu kijken naar de belangrijkste features die dit pakket biedt boven gewone data classes: validators en converters.

Python attrs validator voorbeeld

U kunt validators toevoegen aan uw attrs data class op twee manieren:

  1. Met een decorator
  2. Door een callable functie te leveren

Ik zal hier eerst de callable functie methode demonstreren. Attrs biedt verschillende validators out-of-the-box, waarvan we de instance_of validator in het volgende voorbeeld zullen gebruiken:

>>> @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 probeerden een object C aan te maken met een string-waarde voor x, gooit de instance_of validator een fout omdat het een int-type vereist in plaats van een string.

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 niet deelbaar door 2')
print(DividableByTwo(60))
print(DividableByTwo(11))
# Output zal zoiets zijn als:
# DividableByTwo(x=60)
# ...
# ValueError: 11 is niet deelbaar door 2

Python attrs converter voorbeeld

Een converter neemt de waarde die ingesteld wordt en converteert deze automatisch. U kunt dit voor allerlei doeleinden gebruiken. Een voorbeeld is het automatisch converteren van een waarde naar een int. Nogmaals, laten we beginnen met een callable functie, in dit geval gebruiken we gewoon Python's int() functie:

import attr
@attr.s
class C(object):
    x = attr.ib(converter=int)
c = C("1")
print(c)
# Output:
# C(x=1)

Onze input (de string "1") werd automatisch naar een integer geconverteerd. Omdat converters voor validators draaien, kunt u de eindwaarde na conversie valideren. Bijv., u kunt de bovenstaande twee voorbeelden combineren om eerst elke input naar int te converteren, en dan te checken of de waarde deelbaar is door twee.

Slots gebruiken met Python attrs

Ten slotte kunt u attrs vertellen om geslotten klassen te gebruiken. Geslotten klassen hebben enkele voordelen over gewone klassen:

  • Ze hebben een klein geheugenspoor
  • Ze zijn sneller

Kortom, met een geslotten klasse geeft u expliciet aan welke instance-attributen u verwacht dat uw object-instanties hebben. Op die manier kan Python een aantal checks en dergelijke weglaten, wat resulteert in minder geheugengebruik en lichte snelheidsverhogingen. U kunt meer details vinden in de attrs-documentatie hier.

Echter, geslotten klassen hebben ook nadelen, vooral als u ze handmatig aanmaakt. Gelukkig biedt attrs ons een eenvoudige manier om de feature in te schakelen:

import attr
@attr.s(slots=True)
class YourClassName:
    ...

Blijven leren

  • Ons artikel over Python data classes
  • Onze tutorial over Python klassen en objecten
  • Voor meer voorbeelden, bekijk de attrs voorbeelden-pagina

Python

  1. Python Datatypes onder de knie krijgen: Een praktische gids
  2. Python's strip()-methode beheersen: Uitgebreide handleiding & praktische voorbeelden
  3. Python's str.count() beheersen: Karakters & substrings tellen met voorbeelden
  4. Python round()-functie uitgelegd met praktische voorbeelden
  5. Python's map()-functie beheersen: syntaxis, voorbeelden en best practices
  6. Python timeit() – Uitvoeringstijd meten met praktische voorbeelden
  7. Python Counter in collections – Efficiënt tellen, updaten en rekenkundige operaties
  8. Python time.sleep(): Hoe vertraging toe te voegen aan je code (voorbeeld)
  9. Python list.count(): Expert Gids met Praktische Voorbeelden
  10. Python List index() – Elementposities Vinden met Praktische Voorbeelden
  11. Python Extensieprogrammering met C: Snelle, Native Modules Bouwen