Доступ к ожидаемому типу в Pydantic в средстве проверки переноса полей с использованием аннотированного шаблона.Python

Программы на Python
Anonymous
 Доступ к ожидаемому типу в Pydantic в средстве проверки переноса полей с использованием аннотированного шаблона.

Сообщение Anonymous »

Я использую валидатор переноса полей в Pydantic с шаблоном аннотаций и хочу получить доступ к ожидаемому/аннотированному типу поля из функции валидатора. Вот пример того, что я хочу:

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

from typing import Annotated, Any

from pydantic import (
BaseModel, ValidationError, ValidationInfo,
ValidatorFunctionWrapHandler, WrapValidator
)

def wrapper(value: Any,
handler: ValidatorFunctionWrapHandler,
info: ValidationInfo) -> Any:
try:
return handler(value)
except ValidationError as e:
# Custom error handling where I want to know the expected type.
# I'm looking for something like this:
if info.annotation == str:
# Do something
elif info.annotation == int | bool:
# Do something else
else:
raise

class MyModel(BaseModel):
foo: Annotated[str, WrapValidator(wrapper)]

class AnotherModel(BaseModel):
bar: Annotated[int | bool, WrapValidator(wrapper)]
Я ожидал, что ValidationInfo будет включать ожидаемый тип данных, но, похоже, этого не произошло.
Другой вариант — просмотреть поля модели. Примерно так:

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

MyModel.model_fields[info.field_name].annotation
.
Однако эта оболочка применяется к нескольким моделям, поэтому я не могу просто ссылаться на MyModel таким образом. И снова ValidationInfo, похоже, не содержит никаких ссылок на модель.
Я заметил, что info.config = {"title": "MyModel". Есть ли способ получить класс MyModel из строки «MyModel» и является ли это надежным средством поиска модели?

Это не дубликат этого вопроса, который касается шаблона декоратора для валидаторов, а не шаблона аннотированного, а также использует старый синтаксис из v1.

Подробнее здесь: https://stackoverflow.com/questions/797 ... he-annotat

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