from datetime import datetime
from typing import Generic, TypeVar
from pydantic import BaseModel
from pydantic.generics import GenericModel
T = TypeVar("T", bound=BaseModel)
class OcpiResponse(GenericModel, Generic[T]):
data: T
status_code: int
status_message: str
timestamp: str
@classmethod
def success(cls, data: Generic[T]):
return cls(
data=data,
status_code=1000,
status_message="Success",
timestamp=datetime.now().isoformat()
)
Как добавить тип возвращаемого значения в метод успеха таким образом, чтобы он фиксировал параметр типа? Под этим я подразумеваю, что следующее должно выдать ошибку/предупреждение в IDE:
(Неразрешенная ссылка «OcpiResponse»). Хотя метод, не являющийся классом, набранный таким образом, на самом деле не выдает предупреждений, которые я ожидал бы в случае несоответствия типов.
У меня есть следующий класс с параметром типа, определенным с использованием GenericModel pydantic. [code]from datetime import datetime from typing import Generic, TypeVar from pydantic import BaseModel from pydantic.generics import GenericModel
T = TypeVar("T", bound=BaseModel)
class OcpiResponse(GenericModel, Generic[T]): data: T status_code: int status_message: str timestamp: str
@classmethod def success(cls, data: Generic[T]): return cls( data=data, status_code=1000, status_message="Success", timestamp=datetime.now().isoformat() ) [/code] Как добавить тип возвращаемого значения в метод успеха таким образом, чтобы он фиксировал параметр типа? Под этим я подразумеваю, что следующее должно выдать ошибку/предупреждение в IDE: [code]class Test1(BaseModel): pass
class Test2(BaseModel): pass
def test() -> OcpiResponse[Test2]: return OcpiResponse.success(Test1()) [/code] Я пробовал: [list] [*][code]Self[T][/code] (TypeError: typing.Self не подлежит подписке). Мне этот синтаксис показался бы наиболее логичным. [*][code]Self[/code] (не фиксирует параметр типа). [*][code]OcpiResponse[T][/code] (Неразрешенная ссылка «OcpiResponse»). Хотя метод, не являющийся классом, набранный таким образом, на самом деле не выдает предупреждений, которые я ожидал бы в случае несоответствия типов. [*][code]cls[T][/code] (Неразрешенная ссылка «cls»). [/list]
Рассмотрим следующий случай, когда у нас есть менеджер, который управляет экземплярами определенных классов. Эти классы должны быть подклассами данного класса, но могут определяться пользователем (т.е. являются универсальными).
Поскольку класс...
Как можно объявить подсказки типов, чтобы указать, что функция возвращает экземпляр ссылки на класс, передаваемый в качестве аргумента?
Объявление этого следующим образом не кажется правильным, поскольку это указывает, что возвращаемый тип совпадает...