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'}
2 Réponses :
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.
Ajout d'une option alternative - Modèles Convtools ( docs p.s. Dans votre cas, si vous vous attendiez à obtenir par exemple. Si vous spécifiez que quelque chose devrait être une 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')
"""
str
au lieu de l'énumération dans un dict, vous devriez avoir spécifié str
comme type de champ attendu. 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
.