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

如何在Python3中扩展Union类型,自定义支持多类型的Fooable类型?

实现支持任意数量类型参数的Fooable联合类型

要在Python 3.10以下版本实现支持任意数量类型参数的Fooable,可以借助typing_extensions中的TypeVarTuple和Unpack工具来定义可变长度的联合类型,具体实现如下:

from typing import Union
from typing_extensions import TypeVarTuple, Unpack

class Foo:
    pass

# 定义可变长度的类型变量元组
Ts = TypeVarTuple('Ts')
# 将Foo与任意数量的传入类型组成联合类型
Fooable = Union[Foo, Unpack[Ts]]

用法示例

# 等价于Union[Foo, int, str]
x: Fooable[int, str] = 2

# 等价于Union[Foo, float, bool, list[str]]
y: Fooable[float, bool, list[str]] = True

# 等价于Foo(不传参数时)
z: Fooable = Foo()

关键说明

  1. 工具作用:
    • TypeVarTuple('Ts')用于定义一个可以接收任意数量类型参数的"类型元组变量",解决了单个TypeVar只能接收单一类型的限制。
    • Unpack[Ts]会把传入的多个类型参数展开,和Foo一起组合成最终的联合类型。
  2. 版本兼容:
    • Python 3.6+可以通过pip install typing_extensions安装依赖库。
    • Python 3.11及以上版本中,TypeVarTuple和Unpack已被纳入标准库的typing模块,无需额外安装扩展库。
  3. 灵活度:
    支持0个或任意多个类型参数,完全覆盖你需要的场景,和Optional的使用逻辑一致,只是将None替换为Foo。

类型验证

如果你用mypy等类型检查工具验证,以下代码会符合预期:

# 合法赋值
a: Fooable[int] = 100
b: Fooable[str, dict] = {"key": "value"}

# 以下会触发类型检查错误(符合预期)
# c: Fooable[int] = "hello"
# d: Fooable[bool] = 3.14

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:37:03