Что такое атрибут json_schema в core_schema.json_or_python_schema, используемый в pydanticPython

Программы на Python
Ответить
Anonymous
 Что такое атрибут json_schema в core_schema.json_or_python_schema, используемый в pydantic

Сообщение Anonymous »


Предположим, у меня есть внешний класс OriginalExternalClass, код которого я не могу изменить. Я хочу использовать этот внешний класс как поле другого класса с именем PydanticClassWithExternalClassMember, который является производным от pydantic BaseModel.

Я хочу обойти использование флага произвольных типов, так как хочу реализовать возможности проверки типов и сериализации для поля OriginalExternalClass. Код работает и выглядит следующим образом:

при вводе import Any из pydantic_core импорт core_schema импортировать пидантик класс OriginalExternalClass: def __init__(self, a: int, b: str) -> Нет: self.a = а self.b = b класс PydanticExternalClass (OriginalExternalClass): @classmethod защита __get_pydantic_core_schema__( кл, _source_type: Любой, _handler: pydantic.GetCoreSchemaHandler, ) -> core_schema.CoreSchema: def json_schema (значение: dict) -> OriginalExternalClass: #НИКОГДА НЕ ЗВОНИЛ!!! print("Вызов json_schema") результат = OriginalExternalClass(**значение) вернуть результат защита python_schema( значение: ОригиналВнешнийКласс, ) -> ОригинальныйВнешнийКласс: print("python_schema вызвана") если isinstance(значение, dict): значение = ИсходныйВнешнийКласс(**значение) если не isinstance(значение, OriginalExternalClass): поднять pydantic.ValidationError( msg="Ожидается экземпляр `ExternalClass`", loc=(" Third_party_type",), тип = OriginalExternalClass, ) возвращаемое значение def сериализация (значение: OriginalExternalClass) -> dict: print("Вызов сериализации") return {"a": value.a, "b": value.b} вернуть core_schema.json_or_python_schema( json_schema=core_schema.no_info_plain_validator_function(json_schema), python_schema=core_schema.no_info_plain_validator_function(python_schema), сериализация = core_schema.plain_serializer_function_ser_schema( сериализация ), ) класс PydanticClassWithExternalClassMember(pydantic.BaseModel): х: Пидантикекстерналкласс Однако я не понимаю, когда атрибут json_schema JsonOrPythonSchema создается с помощью json_schema=core_schema.no_info_plain_validator_function(json_schema) использовал? Для чего это нужно? Функция json_schema никогда не вызывается при выполнении:

print( "m1 = PydanticClassWithExternalClassMember(x=PydanticExternalClass(1, 'basgsadf'))" ) m1 = PydanticClassWithExternalClassMember(x=PydanticExternalClass(1, "basgsadf")) print("d = m1.model_dump()") d = m1.model_dump() print("m1 = PydanticClassWithExternalClassMember(**d)") m1 = PydanticClassWithExternalClassMember(**d) И результат
m1 = PydanticClassWithExternalClassMember(x=PydanticExternalClass(1, 'basgsadf')) python_schema вызывается d = m1.model_dump() сериализация называется m1 = PydanticClassWithExternalClassMember(**d) python_schema вызывается
Ответить

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

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

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

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

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