Python类型提示中实现类型交集的「与」运算符是什么?
关于Python实现类型交集(A & B)的解决方案
你的需求是可以实现的,目前主流的实现方案分为两类:
1. 直接使用交集类型语法(需类型检查器支持)
你示例中写的T & Identify语法本身是合法的交集类型声明方式,目前主流类型检查器的支持情况如下:
- Pyright:默认原生支持
&符号声明交集类型,无需额外配置 - mypy 0.990+:支持实验性的交集类型,需要在mypy配置文件中开启实验开关:
# mypy.ini [mypy] enable_experimental_feature = intersection
这种方式的写法和你给出的示例完全一致,不需要额外调整代码,类型检查器会自动识别返回值同时具备泛型T的所有属性和Identify类的id属性。
2. 兼容方案:使用泛型Protocol实现
如果你需要兼容旧版本的类型检查器,可以通过typing.Protocol模拟交集类型的效果,代码示例如下:
from typing import TypeVar, Protocol, Callable, Any T = TypeVar('T') class Identify(Protocol): id: int # 定义泛型Protocol表示同时具备原类型属性和id属性的对象 class Identified(Protocol[T]): # 声明__getattr__协议来兼容原类型T的所有属性 __getattr__: Callable[[str], Any] id: int def test_type_hints(obj: T) -> Identified[T]: obj.id = id(obj) # 类型转换兜底,避免部分旧检查器报错 return obj # type: ignore
Python 3.8以下版本可以从typing_extensions包导入Protocol使用
这种方案不需要依赖类型检查器的实验特性,适配范围更广。
方案优势
你提到的为每种组合单独新建类的方案确实会导致代码冗余,而交集类型/Protocol的核心优势就是可以动态组合多个类型的约束,不需要显式声明每个组合的实体类,类型检查器会自动推导组合后的所有属性提示。
内容的提问来源于stack exchange,提问作者Delta
相关产品推荐
相关产品推荐

