Как при проверке типа заставить атрибут модели pydantic принимать несколько типов ввода для пользовательского класса, неPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как при проверке типа заставить атрибут модели pydantic принимать несколько типов ввода для пользовательского класса, не

Сообщение Anonymous »

Я использую библиотеку Pydantic версии 2.
Я создал собственный класс, который является подклассом int и реализует метод __get_pydantic_core_schema__. p>
При использовании этого пользовательского класса в модели Pydantic я хочу, чтобы средство проверки типов (Basedpyright) понимало, что атрибут созданной модели будет иметь тип моего пользовательского класса. класс, который работает, но также и то, что я могу создать экземпляр модели с помощью str или int.
Однако я не хочу определять перегрузки или переопределить метод __init__ в каждой модели, использующей мой пользовательский класс, поскольку это противоречит цели и делает код очень многословным, особенно если мне нужно переопределить все атрибуты в каждой перегрузке/переопределении __init__.
Вот минимальный воспроизводимый пример:

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

from typing import Any, reveal_type
from pydantic_core import CoreSchema, core_schema
from pydantic import GetCoreSchemaHandler, BaseModel

class MyCustomInt(int):
@classmethod
def __get_pydantic_core_schema__(
cls,
_source_type: Any,
_handler: GetCoreSchemaHandler,
) -> CoreSchema:
def validate_from_int(value: int) -> "MyCustomInt":
if value < 0:
raise ValueError("Cannot be negative")
return cls(value)

from_int_schema = core_schema.chain_schema(
[
core_schema.int_schema(),
core_schema.no_info_plain_validator_function(validate_from_int),
]
)

return core_schema.json_or_python_schema(
json_schema=from_int_schema,
python_schema=core_schema.union_schema(
[
core_schema.is_instance_schema(cls),
from_int_schema,
]
),
serialization=core_schema.plain_serializer_function_ser_schema(
str,
return_schema=core_schema.str_schema(),
when_used='json'
),
)

class MyModel(BaseModel):
value: MyCustomInt

model = MyModel(value="123")  # Error: Argument of type "str" cannot be assigned to parameter "value" of type "MyCustomInt" in function "__init__"
reveal_type(model.value)  # Revealed type is 'MyCustomInt' - Good!
model = MyModel(value=123)  # Error: Argument of type "int" cannot be assigned to parameter "value" of type "MyCustomInt" in function "__init__"
reveal_type(model.value)  # Revealed type is 'MyCustomInt' - Good!
Для ясности: во время выполнения это работает прекрасно, и это исключительно проблема проверки типов.
Есть ли способ сообщить об этом средство проверки типов на предмет допустимых типов проверки для MyCustomInt без необходимости перегружать или переопределять __init__ в каждой модели?

Подробнее здесь: https://stackoverflow.com/questions/792 ... iple-input
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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