Lorsque vous utilisez le type Union avec pydantic, il est bon de le combiner avec Literal

Nous avons implémenté un chat bot, qui consiste à "enregistrer le contenu de la demande passée de l'utilisateur dans Redis et s'y référer si nécessaire pour l'utiliser pour la réponse du bot". Plus précisément, les spécifications et les programmes sont les suivants.

  1. Convertissez le json de la requête de l'utilisateur en type Request et utilisez-le.
  2. Dans Redis, convertissez le type de pydantic en json, enregistrez-le sous forme de chaîne et transtypez-le en type Request lors de sa récupération.
  3. En même temps, affichez le json dans le journal
from __future__ import annotations
from typing import Union, Optional
from typing_extensions import Literal
from .event import EventData


class Request(BaseModel):
    user_id: str
    session_id: str
    command: Union[MessageCommand, ButtonCommand]


class MessageCommand(BaseModel):
    """Lorsqu'un message texte libre est saisi"""
    type: Literal["message"]
    message: Optional[str]
    is_first: bool = False


class ButtonCommand(BaseModel):
    """Lorsque le bouton est enfoncé"""
    type: Literal["button"]
    event: Optional[EventData]
    is_first: bool = False


Request.update_forward_refs()

Au départ, je n'avais pas de propriété pour type, et json, qui devrait être ButtonCommand lors de la récupération de Redis, a été accidentellement converti en un MessageCommand vide. Si vous utilisez la valeur par défaut ou ʻOptional`, vous pouvez convertir le mauvais json.

En spécifiant une chaîne de caractères fixe avec Literal dans la propriété type, vous pouvez sûrement spécifier la destination de la conversion.

référence

Recommended Posts

Lorsque vous utilisez le type Union avec pydantic, il est bon de le combiner avec Literal
Lors de l'utilisation d'optparse avec iPython
Lors de l'utilisation de MeCab avec python dans virtualenv
Précautions lors de l'utilisation de six avec Python 2.5
Quand to_csv avec Pandas, c'est devenu ligne par ligne
À propos de AVERTISSEMENT lors de l'empaquetage avec pyinstaller en utilisant pyocr
Génération de clé secrète lors de l'utilisation d'EncryptedCookieStorage avec aiohttp_session
Qu'utilisez-vous lorsque vous testez avec Python?
Comment traiter l'erreur "Erreur de type: Aucune signature correspondante trouvée" lors de l'utilisation de pandas fillna