如何在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()
关键说明
- 工具作用:
TypeVarTuple('Ts')用于定义一个可以接收任意数量类型参数的"类型元组变量",解决了单个TypeVar只能接收单一类型的限制。Unpack[Ts]会把传入的多个类型参数展开,和Foo一起组合成最终的联合类型。
- 版本兼容:
- Python 3.6+可以通过
pip install typing_extensions安装依赖库。 - Python 3.11及以上版本中,
TypeVarTuple和Unpack已被纳入标准库的typing模块,无需额外安装扩展库。
- Python 3.6+可以通过
- 灵活度:
支持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
相关产品推荐
相关产品推荐

