«Пользовательский валидатор возвращает значение, отличное от «self».» при использовании @model_validator(mode="wrap")Python

Программы на Python
Ответить
Anonymous
 «Пользовательский валидатор возвращает значение, отличное от «self».» при использовании @model_validator(mode="wrap")

Сообщение Anonymous »

Этот класс можно использовать либо в формате JSON с высокой степенью вложенности, либо динамически создавать с помощью программного кода.

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

class CriticalDefinition(BaseModel):
color: Color
value: int

@model_validator(mode="wrap")
@classmethod
def _alias_replacer(cls, v: Any, handler: ModelWrapValidatorHandler[Self]) -> Self:
global _alias
if isinstance(v, str) and (r := _alias.get(v)):
return r
if isinstance(v, dict) and "_alias" in v and (r := _alias.get(v["_alias"])):
return r
return handler(v)
Я определил некоторый часто используемый объект CriticalDefinition как псевдоним. Например, вместо критического: {color: "BLUE", value: 50 в JSON я мог бы написать критическое: "BLUE_50", и это работает по назначению.
Проблема в том, что когда я попытался написать c = CriticalDefinition(_alias="BLUE_50") в коде Python, я получил следующее предупреждение:

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

UserWarning: A custom validator is returning a value other than `self`.
Returning anything other than `self` from a top level model validator isn't supported when validating via `__init__`.
See the `model_validator` docs (https://docs.pydantic.dev/latest/concepts/validators/#model-validators) for more details.
c = CriticalDefinition(_alias="BLUE_50")
объект результата c не соответствует ожиданиям; он кажется совершенно пустым.
В документе, предоставленном по ссылке, говорится следующее:

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

Я думаю, что я написал код так, как сказано в документе (т. е. я вернул данные раньше). Но я не знаю, что я сделал не так.

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

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

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

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

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

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