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

Python中Union类型提示能否支持动态拼接可变数量的枚举类型?

解决方案

你的需求完全可以实现,原有写法不生效是因为Python静态类型语法不支持在Union参数内直接解包运行时生成的列表,我们可以通过运行时构造Union类型的方式实现自动同步child_mapping的枚举类型,同时兼容Pydantic的自动校验。

实现代码

from typing import Union
from enum import Enum
from pydantic import BaseModel

# 原有枚举定义部分
class MainEnum(str, Enum):
    A = "AA"
    B = "BB"

class ChildAEnum(str, Enum):
    C = "CC"
    D = "DD"

class ChildBEnum(str, Enum):
    E = "EE"
    F = "FF"

child_mapping = {
    MainEnum.A: ChildAEnum,
    MainEnum.B: ChildBEnum,
}

# 动态构造所有子枚举的Union类型
ChildEnumUnion = Union[tuple(child_mapping.values())]

# 定义模型
class Something(BaseModel):
    some_child: ChildEnumUnion

验证效果

# 合法值校验通过
print(Something(some_child=ChildAEnum.C))  # 输出:some_child=<ChildAEnum.C: 'CC'>
print(Something(some_child=ChildBEnum.F))  # 输出:some_child=<ChildBEnum.F: 'FF'>

# 非法值校验失败
try:
    Something(some_child="invalid_value")
except Exception as e:
    print(e)
    # 输出类似:1 validation error for Something
    # some_child
    #   Input should be 'CC', 'DD', 'EE' or 'FF' [type=enum, input_value='invalid_value', input_type=str]

注意事项

  • 必须保证child_mapping的所有键值对都定义完成后,再构造ChildEnumUnion,后续新增映射时只需要更新child_mapping即可,不需要修改Union和模型定义。
  • 该写法兼容Pydantic V1和V2版本的运行时校验,如果需要适配mypy等静态类型检查工具,可以搭配typing.cast做类型标注辅助,不影响运行时逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:48:03