Python泛型属性返回self时mypy报返回值类型不兼容如何解决?
解决方案
错误原因
BaseNode类中dummy属性、parent/left/right字段的类型注解固定为BaseNode,子类继承BaseNode后,这些属性实际返回的是子类实例,mypy无法自动识别这种「返回值与当前实例类型一致」的关联关系,因此会报类型不匹配错误。
修复方法
使用Self类型标注所有返回当前类实例的属性:
- Python 3.11+ 可直接从
typing模块导入Self - Python 3.10及更低版本可安装
typing-extensions依赖,从typing_extensions导入Self
修改后的完整代码如下:
from __future__ import annotations import dataclasses from typing import Generic, TypeVar, Optional, Self GenericNodeValue = TypeVar('GenericNodeValue') @dataclasses.dataclass class BaseNode(Generic[GenericNodeValue]): value: GenericNodeValue parent: Optional[Self] = None left: Optional[Self] = None right: Optional[Self] = None @property def dummy(self) -> Self: return self GenericNode = TypeVar('GenericNode', bound=BaseNode) class BaseTree(Generic[GenericNode]): def __init__(self): self.root: Optional[GenericNode] = None def get_dummy(self, node: GenericNode) -> GenericNode: return node.dummy @dataclasses.dataclass class RedBlackTreeNode(BaseNode[int]): red: bool = False class RedBlackTree(BaseTree[RedBlackTreeNode]): def get_dummy2(self, node: RedBlackTreeNode) -> RedBlackTreeNode: return node.dummy
校验效果
修改后执行mypy校验不会再出现类型不匹配错误,同时完全保留原逻辑,也支持后续其他继承BaseNode的子类的类型校验。
内容的提问来源于stack exchange,提问作者tbicr
相关产品推荐
相关产品推荐

