静态类型检查器与语言服务器无法识别子类对象属性的问题
解决方案
核心问题是Edge子类未明确绑定具体的Node子类型作为泛型参数,导致静态检查器无法推断source/target的实际类型,仅能识别基类Node的属性。以下是可通过mypy和pylsp检查的实现方案:
1. 定义带约束的泛型类型变量与基类
from typing import Generic, TypeVar # 定义两个独立的类型变量,分别约束为Node基类,用于区分source和target的类型 SourceNodeT = TypeVar("SourceNodeT", bound="Node") TargetNodeT = TypeVar("TargetNodeT", bound="Node") class Node: base_param: str = "base_value" # 双泛型Edge基类,分别绑定source和target的类型变量 class Edge(Generic[SourceNodeT, TargetNodeT]): def __init__(self, source: SourceNodeT, target: TargetNodeT) -> None: self.source = source self.target = target
2. 实现Node子类
class NodeType1(Node): node_param_type1: int = 123 class NodeType2(Node): node_param_type2: str = "type2_value"
3. 定义特定Edge子类并绑定具体泛型参数
# 明确指定该Edge的source为NodeType1,target为NodeType2 class EdgeType1ToType2(Edge[NodeType1, NodeType2]): # 可添加子类专属属性/方法 edge_specific_flag: bool = True
4. 验证静态检查有效性
node1 = NodeType1() node2 = NodeType2() edge_12 = EdgeType1ToType2(node1, node2) # 静态检查器会正确识别以下属性,无报错 print(edge_12.source.node_param_type1) # 识别为NodeType1的int属性 print(edge_12.target.node_param_type2) # 识别为NodeType2的str属性 print(edge_12.source.base_param) # 仍可访问基类属性
关键说明
- 无需给Edge子类重写
__init__方法,泛型基类的构造方法会自动保留类型信息。 - 若需支持同类型Node的连接,可改用单泛型类型变量;跨类型连接必须用双泛型分别约束。
- 之前的尝试无效,是因为未给Edge子类明确绑定具体的泛型参数,导致静态检查器只能将
source/target推断为基类Node类型。
内容的提问来源于stack exchange,提问作者Fillipe Goulart
相关产品推荐
相关产品推荐

