如何正确标注继承泛型基类子类的类的类型?
问题描述
我有两个继承自dict的类,代码如下:
class A(dict): class B(A):
这能正常运行,两个类继承了dict的功能并实现其他需求。但我想添加类型提示:类A需要缩小Dict泛型的范围,类B需要进一步缩小该范围。例如我想写成:
class A(Dict[str, Any]): class B(A[str, int]):
这样写A没问题,但B的写法存在语法错误。B并非A的子类型(因为它仅能处理int类型),这是可接受的,但我需要它继承A。有没有办法让mypy识别B的正确类型同时保持继承关系?目前我想到的唯一方案是重新实现A的所有继承方法,但这会产生大量仅用于类型声明的运行时代码。
解决方案
可以通过让A成为泛型类来实现需求,既保留继承关系,又能让mypy识别正确的类型约束,无需重复实现方法:
先将类A定义为泛型类,固定键类型为
str,值类型设为泛型参数:from typing import Dict, Generic, TypeVar, Any V = TypeVar('V') # 定义值类型的泛型变量 class A(Dict[str, V], Generic[V]): # 保留A原本的业务逻辑即可 pass类B继承A时指定泛型参数为
int,这样既继承A的所有功能,又能让mypy识别B的类型为Dict[str, int]:class B(A[int]): # 添加B独有的业务逻辑 pass
这样处理后:
- 实例化
A时可指定值类型,比如A[Any]();如果希望A默认值类型为Any,可以修改泛型变量定义:V = TypeVar('V', default=Any),之后直接写A()就等价于A[Any]() B的实例会被mypy正确识别为键是str、值是int的字典类型,同时完全继承A的方法和属性,无需重复实现
内容的提问来源于stack exchange,提问作者strubbly
相关产品推荐
相关产品推荐

