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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:36:04