如何为继承自Generic类的Python子类添加类型提示?
解决泛型类实例的类型提示问题
你遇到的问题是因为BaseClass是泛型类本身(属于类型构造器),而非它的实例类型,直接用BaseClass作为参数类型提示会导致mypy报错。可以用以下几种方式修正:
方案1:使用BaseClass[Any]
如果不关心具体的泛型参数类型,只需要确保传入的是BaseClass的任意泛型实例,可这样写:
from typing import Any def my_func(my_arg: BaseClass[Any]): my_arg.my_func()
方案2:明确列出允许的子类类型
如果仅接受ClassA、ClassB、ClassC的实例,直接用Union组合类型:
from typing import Union def my_func(my_arg: Union[ClassA, ClassB, ClassC]): my_arg.my_func()
方案3:用TypeVar限定泛型参数范围
如果想保留泛型灵活性,同时限制泛型参数只能是Dog、Cat、Horse,可以定义一个限定范围的TypeVar:
from typing import TypeVar T = TypeVar('T', Dog, Cat, Horse) def my_func(my_arg: BaseClass[T]): my_arg.my_func()
错误原因说明
你原本写的BaseClass代表的是泛型类这个对象本身(比如用来创建实例的类),而非BaseClass的实例类型。mypy会把它识别为类类型,而非实例类型,因此会提示"BaseClass not callable"错误——因为它预期你传入类对象,但实际传入的是实例,类型不匹配。
内容的提问来源于stack exchange,提问作者CrazySynthax
相关产品推荐
相关产品推荐

