111 votes

Bonne approche pour valider les attributs d'une instance de classe

Avoir une classe Python simple comme celle-ci:

class Spam(object):
    __init__(self, description, value):
        self.description = description
        self.value = value

Je voudrais vérifier les contraintes suivantes:

  • "la description ne peut pas être vide"
  • "la valeur doit être supérieure à zéro"

Devrais-je:
1. valider les données avant de créer l'objet spam ?
2. vérifier les données dans la méthode __init__ ?
3. créer une méthode is_valid dans la classe Spam et l'appeler avec spam.isValid() ?
4. créer une méthode statique is_valid dans la classe Spam et l'appeler avec Spam.isValid(description, valeur) ?
5. vérifier les données lors de la déclaration des setters ?
6. etc.

Pouvez-vous recommander une approche bien conçue/pythonique/pas verbeuse (sur une classe avec de nombreux attributs)/élégante ?

0voto

Nikita Almakov Points 187

Je travaille sur une autre bibliothèque de validation - modèles convtools (docs / github).

La vision de cette bibliothèque est :

  • validation d'abord
  • pas de conversion de type implicite
  • pas de pertes de données implicites lors de la conversion de type - par exemple, convertir 10.0 en entier est bon, 10.1 ne l'est pas
  • si une instance de modèle existe, elle est valide.

    from collections import namedtuple from typing import Union

    from convtools.contrib.models import ObjectModel, build, validate, validators

    données d'entrée pour le test

    SpamTest = namedtuple("SpamTest", ["description", "value"])

    class Spam(ObjectModel): description: str = validate(validators.Length(min_length=1)) value: Union[int, float] = validate(validators.Gt(0))

    spam, errors = build(Spam, SpamTest("", 0)) """

    In [34]: errors Out[34]: {'description': {'__ERRORS': {'min_length': 'la longueur est 0, mais elle devrait être >= 1'}}, 'value': {'__ERRORS': {'gt': 'devrait être > 0'}} """

    spam, errors = build(Spam, SpamTest("foo", 1)) """

    In [42]: spam Out[42]: Spam(description='foo', value=1) In [43]: spam.to_dict() Out[43]: {'description': 'foo', 'value': 1} In [44]: spam.description Out[44]: 'foo' """

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X