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
相关产品推荐
相关产品推荐

