如何让mypy识别子类中基于类变量创建的实例类型
解决mypy无法识别子类中validator_cls实例类型的问题
核心问题分析
当前代码中,父类的TypeVar[T]未与子类的validator_cls建立明确的泛型绑定关系,同时父类process_data方法直接引用未限定的validator_cls(而非self.validator_cls),导致mypy无法追踪子类中具体的验证器类型。
调整方案
通过将父类改为泛型类,明确绑定子类的泛型参数,让mypy能够关联validator_cls的具体类型:
import abc from typing import Type, TypeVar, Generic, Any # 定义与验证器类型绑定的TypeVar T = TypeVar("T") class Parent(abc.ABC, Generic[T]): # 类变量标注为对应泛型类型的构造器 validator_cls: Type[T] def process_data(self, data: dict[str, Any]) -> T: # 通过self引用类变量,确保子类继承后的正确性 entry = self.validator_cls(**data) # 执行其他逻辑 return entry # 示例验证器类 class SomeValidator: def __init__(self, name: str, value: int) -> None: self.name = name self.value = value class ChildOne(Parent[SomeValidator]): # 绑定具体的验证器类 validator_cls = SomeValidator # mypy会自动推断返回类型为SomeValidator,也可显式标注 def process_data(self, data): entry = self.validator_cls(**data) # mypy现在会识别entry为SomeValidator类型 return entry
关键改动说明
- 让
Parent继承Generic[T],将泛型参数与类绑定,子类可指定自身对应的验证器类型 - 父类
process_data方法通过self.validator_cls引用类变量,避免名称错误的同时,让mypy能追踪子类的具体实现 - 子类继承时显式指定泛型参数
Parent[SomeValidator],明确告知mypy当前子类的validator_cls对应类型
调整后,mypy即可正确识别entry的类型为SomeValidator,不再判定为Any。
内容的提问来源于stack exchange,提问作者Dmitry Mantis
相关产品推荐
相关产品推荐

