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
相关产品推荐
相关产品推荐

