我使用以下代码创建 G 类的子类并将它们应该生成的模型类型传递给它们。
from typing import TypeVar, Type
class A:
@classmethod
def model_validate(cls):
print('Done')
T = TypeVar('T', bound=A)
class G[T]:
def __init__(self, model: Type[T]):
self.model = model
def func(self) -> None:
print(self.model.model_validate())
G[A](A).func()
这工作正常,但 mypy 给出了这个错误:
error: "type[T]" has no attribute "model_validate" [attr-defined]
我做错了什么?
您混淆了两个类型变量。
T = TypeVar...
定义一个有界限的 typevar,然后G[T]
完全忽略它,创建一个新的 typevar(没有界限)并使用它。使用旧式泛型(playground):
或新式 PEP695 泛型(playground):
两者都可以被 mypy 接受。另请注意,如果您使用的是非 EOL Python 版本,则无需使用此选项(如上所示,从 3.9 开始应使用
typing.Type
内置版本)。type