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

Python泛型Protocol约束下,如何标注仅接受XTImpl的变量类型?

解决方案

1. 标注fT的参数x

要让fT仅接受XTImpl,同时兼容fB和fC的参数要求,可以利用类型交集(&)来标注x的类型:

def fT(x: type[X[B]] & type[X[C]]):
    fB(x)
    fC(x)

类型检查器会要求x必须同时满足type[X[B]]和type[X[C]]。XTImpl作为泛型类,继承自X[T](T可绑定B或C),完全符合这个交集约束;而XBImpl仅实现了X[B],无法满足type[X[C]]的要求,会被类型检查器拒绝。

2. 标注仅接受XTImpl实例的变量

如果需要标注变量仅接受XTImpl的实例(无论泛型参数是B还是C),可以直接使用联合类型:

# 接受XTImpl[B]或XTImpl[C]的实例
obj: XTImpl[B] | XTImpl[C] = XTImpl()

也可以定义一个协变TypeVar简化标注:

from typing import TypeVar

T_co = TypeVar("T_co", B, C, covariant=True)

# 接受任意XTImpl实例
obj: XTImpl[T_co] = XTImpl()

验证效果

用类型检查器(如mypy)验证时:

  • 传入XTImpl给fT会通过检查
  • 传入XBImpl给fT会报错,提示不符合type[X[C]]约束
  • fB传入XTImpl或XBImpl都能通过检查,符合需求

内容的提问来源于stack exchange,提问作者Abel Adary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:20:54