如何实现类型映射并让Python类型检查器识别返回类型?
解决方案
可以通过Protocol协议约束Raw类型,让每个Raw类自主声明对应的目标类型,结合TypeVar实现类型自动推断,彻底避免繁琐的overload枚举:
步骤1:定义约束Raw类型的Protocol
先定义一个Protocol,要求所有Raw类型必须包含_target_type类属性,指向对应的目标类型:
from typing import Protocol, TypeVar, Type # 定义关联Raw类型与目标类型的类型变量 T = TypeVar('T') class RawProtocol(Protocol[T]): _target_type: Type[T]
步骤2:修改Raw类实现协议
给每个Raw类添加_target_type属性,明确绑定对应的目标类型:
class A: pass class RawA: _target_type = A # 绑定到目标类型A class B: pass class RawB: _target_type = B # 绑定到目标类型B
步骤3:实现带类型推断的unraw函数
借助Protocol的类型约束,类型检查器会自动根据输入的Raw实例推断返回类型:
def unraw(obj: RawProtocol[T]) -> T: # 此处编写实际转换逻辑,示例为创建目标类型实例返回 return obj._target_type()
类型检查效果
传入RawA()时,类型检查器会自动识别返回类型为A;传入RawB()时,返回类型为B,完全无需逐个编写overload。
替代方案:全局映射表+TypeVar绑定
若更倾向于维护全局映射关系,可通过TypeVar绑定联合类型实现,但需同步维护联合类型与映射表,灵活性不如Protocol方案:
from typing import TypeVar, Type, Union RawUnion = Union[RawA, RawB] TargetUnion = Union[A, B] TRaw = TypeVar('TRaw', bound=RawUnion) TTarget = TypeVar('TTarget', bound=TargetUnion) # 全局类型映射表 raw_to_target: dict[Type[TRaw], Type[TTarget]] = { RawA: A, RawB: B } def unraw(obj: TRaw) -> TTarget: target_cls = raw_to_target[type(obj)] return target_cls()
内容的提问来源于stack exchange,提问作者JoniKauf
相关产品推荐
相关产品推荐

