You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类型映射并让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:57:16