Как обойти отсутствие высокоуровневой поддержки кортежей Unpack в Pydantic?Python

Программы на Python
Ответить
Anonymous
 Как обойти отсутствие высокоуровневой поддержки кортежей Unpack в Pydantic?

Сообщение Anonymous »

Я пытаюсь представить кортеж Pydantic BaseModel переменной длины как RootModel. Однако проблема №5952 указывает на то, что, хотя pydantic-core поддерживает проверку таких типов, Pydantic в настоящее время не предоставляет высокоуровневую поддержку для создания соответствующей схемы. Меня вполне устраивает написание собственной одноразовой схемы, так как мои требования просты, но я не могу сделать это правильно.
Как определить схему pydantic-core, которая представляет следующий тип?

Код: Выделить всё

class CommonBase(BaseModel, ABC):
@model_validator(mode="wrap")
@classmethod
def validate_dat(cls, data, handler, info) -> Self:
...

# Other stuff...

class ClrMamePro(CommonBase):
...

class Game(CommonBase):
...

class ParsedDatFile(RootModel):
root: tuple[ClrMamePro, *tuple[Game, ...]]
Мне не нужна схема для произвольных вариационных кортежей с дженериками или чем-то еще; Мне просто нужно проверить/сериализовать кортеж, который начинается с ClrMamePro и продолжается нулем или более Game.
Я определил ParsedDatFile следующим образом:

Код: Выделить всё

class ParsedDatFile(RootModel, frozen=True):
root: tuple[ClrMamePro, *tuple[Game, ...]]

@override
@classmethod
def __get_pydantic_core_schema__(cls, source_type, handler):
return core_schema.tuple_schema(
[ClrMamePro.__pydantic_core_schema__, Game.__pydantic_core_schema__],
variadic_item_index=1,
min_length=1,
)

ParsedDatFile.model_rebuild()
Но, несмотря на это, я все равно получаю исключение «класс не полностью определен».


Подробнее здесь: https://stackoverflow.com/questions/798 ... ack-tuples
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»