Generic класса игнорируется конструктором Generic PydanticPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Generic класса игнорируется конструктором Generic Pydantic

Сообщение Anonymous »

У меня есть универсальный класс с функцией, которая возвращает модель Pydantic, где одно из полей является универсальным типом. Далее следует фрагмент кода, определяющий два класса: общий GetValue и GetInt. Я не понимаю, почему поведение GetValue[int] отличается от поведения GetInt.

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

from typing import Any, Generic, TypeVar

from pydantic import BaseModel

X = TypeVar("X")

class TestModel(BaseModel, Generic[X]):
a: X

T = TypeVar("T")

class GetValue(Generic[T]):

@classmethod
def get_value(cls, x: Any) -> TestModel[T]:
return TestModel[T](a=x)

class GetInt:
@classmethod
def get_value(cls, x: Any) -> TestModel[int]:
return TestModel[int](a=x)

res = GetValue[int].get_value("1")
assert type(res.a) == str

res_2 = GetInt.get_value("1")

assert type(res_2.a) == int

assert res.a != res_2.a # I want these two to be equal, not sure why they are different.

x: Any = "1"
res_3 = TestModel[int](a=x)
assert type(res_3.a) == int
Проверяя все в своем отладчике, я вижу, что в этом вызове функции GetValue[int].get_value("1") T — это просто TypeVar. Это заставляет Pydantic использовать аннотацию Any для , поэтому она остается строкой. res_3 показывает, что когда тип передается классу Pydantic, он преобразует строку в int. Я не уверен, почему эта конструкция не работает так, как я ожидал. Все еще новичок в системе типизации Python, надеялся, что кто-нибудь сможет пролить свет на этот вопрос.
Версия Python: Python 3.12.5
pydantic версия: 2.10. 0

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

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

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

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

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

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

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