[PYTHON] Wenn Sie den Union-Typ mit pydantic verwenden, ist es gut, ihn mit Literal zu kombinieren

Wir haben einen Chat-Bot implementiert, der "den Inhalt der früheren Anfrage des Benutzers in Redis speichert und bei Bedarf darauf verweist, um ihn für die Bot-Antwort zu verwenden". Insbesondere sind die Spezifikationen und Programme wie folgt.

  1. Wandeln Sie den json der Benutzeranforderung in den Typ "Anfrage" und verwenden Sie ihn.
  2. Konvertieren Sie in Redis den pydantischen Typ in "json", speichern Sie ihn als Zeichenfolge und wandeln Sie ihn beim Abrufen in den Typ "Request" um.
  3. Geben Sie gleichzeitig den json in das Protokoll aus
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):
    """Wenn eine Freitextnachricht eingegeben wird"""
    type: Literal["message"]
    message: Optional[str]
    is_first: bool = False


class ButtonCommand(BaseModel):
    """Wenn die Taste gedrückt wird"""
    type: Literal["button"]
    event: Optional[EventData]
    is_first: bool = False


Request.update_forward_refs()

Anfangs hatten wir keine Eigenschaft für "type", und json, das beim Abrufen von Redis "ButtonCommand" sein sollte, wurde versehentlich als leerer "MessageCommand" umgewandelt. Wenn Sie den Standardwert oder "Optional" verwenden, können Sie den falschen json umwandeln.

Durch Angabe einer festen Zeichenfolge mit Literal in der Eigenschaft type können Sie das Konvertierungsziel sicher angeben.

Referenz

Recommended Posts

Wenn Sie den Union-Typ mit pydantic verwenden, ist es gut, ihn mit Literal zu kombinieren
Bei Verwendung von optparse mit iPython
Bei Verwendung von MeCab mit virtualenv python
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Bei to_csv mit Pandas wurde es Zeile für Zeile
Über WARNUNG beim Verpacken mit Pyinstaller mit Pyocr
Geheime Schlüsselgenerierung bei Verwendung von EncryptedCookieStorage mit aiohttp_session
Was verwenden Sie beim Testen mit Python?
Umgang mit dem Fehler "Typfehler: Keine übereinstimmende Signatur gefunden" bei Verwendung von pandas fillna