корректные pydantic модели для автоматического определения класса по полю type

This commit is contained in:
Егор Кандрушин 2026-04-02 00:40:30 +03:00
parent b34cbaf677
commit 1e256a545b
11 changed files with 294 additions and 148 deletions

View file

@ -0,0 +1,33 @@
from enum import Enum
from pydantic import BaseModel, Field, TypeAdapter
from typing import Annotated, Union, Literal
__all__ = ['EClientMessage', 'MsgUserMessage', 'ClientMessage']
class EClientMessage(str, Enum):
USER_MESSAGE = "USER_MESSAGE"
class MsgUserMessage(BaseModel):
"""
Полное сообщение от пользователя.
"""
type: Literal[EClientMessage.USER_MESSAGE] = EClientMessage.USER_MESSAGE
text: str
"""
Текст сообщения.
"""
ClientMessage = TypeAdapter(Annotated[
Union[MsgUserMessage,],
Field(discriminator="type")
])
"""
Объединяет все типы входящих сообщений в одно для удобной автоматической десериализации.\n
Pydantic сам определит нужный тип в зависимости от поля ``type``.\n
Использование:\n
msg = ClientMessage.model_validate_json(json)
"""