2017-08-23 3 views
2

Selon les docs Guimauve officiels, il est recommandé de déclarer un schéma et une classe distincte qui reçoit les données chargées, comme ceci:En utilisant Marshmallow sans me répéter

class UserSchema(Schema): 
    name = fields.Str() 
    email = fields.Email() 
    created_at = fields.DateTime() 

    @post_load 
    def make_user(self, data): 
     return User(**data) 

Cependant, ma User classe serait ressembler à quelque chose comme ceci:

class User: 
    def __init__(name, email, created_at): 
     self.name = name 
     self.email = email 
     self.created_at = created_at 

cela semble me répéter inutilement et je n'aime vraiment pas avoir à écrire les noms d'attributs plus de trois fois. Cependant, j'aime bien l'auto-complétion de l'IDE et la vérification de type statique sur des structures bien définies.

Donc, y a-t-il une meilleure pratique pour charger des données sérialisées selon un schéma de guimauve sans définir une autre classe?

Répondre

1

Pour les classes Python vanille, il n'existe pas de méthode out-of-box permettant de définir la classe du schéma sans répéter les noms de champ.

Si vous utilisez SQLAlchemy par exemple, vous pouvez définir le schéma directement à partir du modèle avec marshmallow_sqlalchemy.ModelSchema:

from marshmallow_sqlalchemy import ModelSchema 
from my_alchemy_models import User 

class UserSchema(ModelSchema): 
    class Meta: 
     model = User 

va de même pour flacon-sqlalchemy qui utilise flask_marshmallow.sqla.ModelSchema.

Dans le cas des classes Python de vanille, vous pouvez définir les champs une fois et l'utiliser pour les schémas et le modèle/classe:

USER_FIELDS = ('name', 'email', 'created_at') 

class User: 
    def __init__(self, name, email, created_at): 
     for field in USER_FIELDS: 
      setattr(self, field, locals()[field]) 

class UserSchema(Schema): 
    class Meta: 
     fields = USER_FIELDS 

    @post_load 
    def make_user(self, data): 
     return User(**data) 
+1

Définition de la classe 'setattr' me empêche de définir des règles de validation, qui C'est la raison pour laquelle je m'embête avec Marshmallow après tout. Je pourrais utiliser un 'collections.namedtuple', mais cela semble plutôt maladroit quand les schémas imbriqués sont impliqués. – Teyras

+0

@Teyras Pour de tels cas, je suppose que vous devrez répéter les champs. Les docs le font explicitement. –