Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Python

Python Attrs :classes de données avancées, avec un exemple de code

Le package Python Attrs vous permet de créer des classes de données avancées à l'aide d'annotations simples. Bien sûr, python possède également son propre module de classe de données natif, mais le package Python attrs offre quelques fonctionnalités supplémentaires que vous pourriez aimer !

Table des matières

  • Installer les attributs
  • Attrs vs classes de données
  • Un exemple basique d'attrs Python
  • Exemple de validateur Python attrs
  • Exemple de convertisseur Python attrs
  • Utiliser des emplacements avec des attributs Python
  • Continuez à apprendre

Installer les attributs

Le package attrs ne fait pas partie de la bibliothèque de base, vous devrez donc l'installer avec la commande pip install ou quelque chose de similaire, comme Pipenv. Vous souhaitez probablement également créer un environnement virtuel, afin qu'il n'interfère pas avec d'autres projets que vous avez. Le paquet s'appelle attrs, donc son installation ressemblera à ceci :

$ pip install attrs

# or with pipenv:
$ pipenv install attrs

Attrs vs classes de données

Les auteurs de attrs ont, en fait, travaillé sur le PEP qui a introduit des classes de données dans Python. Les classes de données natives de Python sont intentionnellement simplifiées et plus faciles à comprendre tout en offrant la gamme complète de fonctionnalités que vous pourriez souhaiter !

Certaines des raisons de choisir Python attrs sur les classes de données intégrées sont :

  • Vous utilisez une version Python antérieure à la 3.7. Attrs vous a couvert car il prend en charge toutes les versions Python grand public, y compris CPython 2.7 et PyPy.
  • Vous voulez plus de fonctionnalités :attrs propose des validateurs et des convertisseurs
  • Vous souhaitez des performances optimales et une utilisation minimale de la mémoire à l'aide des classes à créneaux attrs

Un exemple de base d'attributs Python

Regardons d'abord un exemple très basique :

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)

Quelques remarques :

  • La syntaxe est moins élégante et plus détaillée que celle des classes de données, mais vous obtenez des fonctionnalités supplémentaires en retour.
  • Semblable aux classes de données, vous obtenez une représentation bien formatée de vos données lorsque vous les imprimez.
  • Le paquet attrs utilise des noms choisis intelligemment comme attr.ib , il vous suffit donc d'importer attr. Vous pouvez également importer les noms complets. Par exemple avec from attr import attrib, attrs , et utilisez ces noms à la place. La fonctionnalité est la même.

Examinons ensuite les fonctionnalités les plus importantes que ce package offre par rapport aux classes de données classiques :les validateurs et les convertisseurs.

Exemple de validateur Python attrs

Vous pouvez ajouter des validateurs à votre classe de données attrs de deux manières :

  1. Utiliser un décorateur
  2. En fournissant une fonction appelable

Je vais d'abord démontrer la méthode de la fonction appelable ici. Attrs propose plusieurs validateurs prêts à l'emploi, dont nous utiliserons le instance_of validateur dans l'exemple suivant :

>>> @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'>).", ...

Puisque nous avons essayé de créer un objet C avec une valeur de chaîne pour x, le validateur instance_of renvoie une erreur car il nécessite un type int au lieu d'une chaîne.

Définissons maintenant notre propre validateur :

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

Exemple de convertisseur d'attrs Python

Un convertisseur prend la valeur définie et la convertit automatiquement. Vous pouvez l'utiliser à toutes sortes de fins. Un exemple consiste à convertir automatiquement une valeur en int. Encore une fois, commençons par utiliser une fonction appelable, dans ce cas, nous utilisons simplement la fonction int() de Python :

import attr

@attr.s
class C(object):
    x = attr.ib(converter=int)

c = C("1")
print(c)
# Output:
# C(x=1)

Notre entrée (la chaîne "1") a été automatiquement convertie en entier. Étant donné que les convertisseurs sont exécutés avant les validateurs, vous pouvez valider la valeur finale après la conversion. Par exemple, vous pouvez utiliser les deux exemples ci-dessus pour convertir d'abord n'importe quelle entrée en int, puis vérifier si la valeur est divisible par deux.

Utiliser des emplacements avec des attributs Python

Enfin, vous pouvez indiquer à attrs d'utiliser des classes à créneaux. Les cours à créneaux présentent certains avantages par rapport aux cours réguliers :

  • Ils ont une faible empreinte mémoire
  • Ils sont plus rapides

En bref, avec une classe à créneaux, vous indiquez explicitement les attributs d'instance que vous attendez de vos instances d'objet. De cette façon, Python peut omettre certaines vérifications et autres, ce qui entraîne une utilisation moindre de la mémoire et une légère augmentation de la vitesse. Vous pouvez trouver plus de détails dans la documentation attrs ici.

Cependant, les classes à créneaux comportent également des mises en garde, en particulier lorsque vous les créez manuellement. Heureusement, attrs nous propose un moyen simple d'activer la fonctionnalité :

import attr

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

Continuez à apprendre

  • Notre article sur les classes de données Python
  • Notre tutoriel sur les classes et les objets Python
  • Pour plus d'exemples, consultez la page d'exemples attrs

Python

  1. Python String strip() Fonction avec EXAMPLE
  2. Python String count() avec des EXEMPLES
  3. Fonction Python round() avec EXEMPLES
  4. Fonction Python map() avec EXEMPLES
  5. Python Timeit() avec des exemples
  6. Compteur Python dans les collections avec exemple
  7. Python time.sleep() :ajoutez un délai à votre code (exemple)
  8. Python List count() avec des EXEMPLES
  9. Index de liste Python () avec exemple