Я создал собственный класс, который является подклассом 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
Мобильная версия