33
votes

Le champ d'énumération pydatique n'est pas converti en chaîne

J'essaie de restreindre un champ dans une classe à une enum. Cependant, lorsque j'essaie de retirer un dictionnaire de la classe, il n'est pas converti en chaîne. Au lieu de cela, il conserve l'énumération. J'ai vérifié documentation pydantique , mais je n'ai rien trouvé de pertinence à mon problème.

Ce code est représentatif de ce dont j'ai réellement besoin.

from enum import Enum
from pydantic import BaseModel

class S(str, Enum):
    am='am'
    pm='pm'

class K(BaseModel):
    k:S
    z:str

a = K(k='am', z='rrrr')
print(a.dict()) # {'k': <S.am: 'am'>, 'z': 'rrrr'}

J'essaie d'obtenir la méthode .dict () à retourner {'k' : 'am', 'z': 'rrrr'}


0 commentaires

2 Réponses :


65
votes

4 commentaires

Existe-t-il une raison que cette option est fausse par défaut? Je pense que dans la plupart des cas, nous aurions besoin que cela soit vrai.


@Krishna on pourrait dire pourquoi ne pas laisser des dates sous forme de cordes ISO8601? Principe de la moins surprise est que vous obteniez ce que vous demandez, vous avez demandé une enum


Existe-t-il un moyen d'utiliser les valeurs d'énumération lors de la sérialisation en utilisant .dict () mais gardez l'énumération complète lors de la désérialisation et de la construction de l'objet pydatique?


Je me demandais la même chose que @vianmixt. La raison pour laquelle quelqu'un utiliserait une énumération est que lorsque vous travaillez avec l'objet, on a la commodité que les énumérations offrent, mais pourtant, il peut être sérialisé en tant que chaîne car c'est le moyen le plus simple d'être indépendant du langage.



0
votes

Ajout d'une option alternative - Modèles Convtools ( docs / github ). Cette bibliothèque n'effectue pas de coulée implicite, vous pouvez donc préserver vos types et ajouter la validation nécessaire.

from enum import Enum
from convtools.contrib.models import build, DictModel, validate, validators

class S(Enum):
    AM = "am"
    PM = "pm"


class K(DictModel):
    k: str = validate(validators.Enum(S))
    z: str


obj, errors = build(K, {"k": "am", "z": "rrrr"})
"""
>>> In [4]: obj
>>> Out[4]: K(k='am', z='rrrr')
"""

p.s. Dans votre cas, si vous vous attendiez à obtenir str au lieu de l'énumération dans un dict, vous devriez avoir spécifié str comme type de champ attendu.

par exemple. Si vous spécifiez que quelque chose devrait être une Date , pourquoi deviendrait-il autre chose lorsqu'il est exporté en tant que dicts? Si vous vous attendez à ce que votre sortie contienne uniquement des types primitifs, vous cherchez probablement à l'exporter comme json.dumps avec un json.jsonencoder .

/ / p>


0 commentaires