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

当Flag枚举值为元组时,如何正确组合枚举成员?

如何在元组形式定义的IntFlag枚举中正确定义组合成员

错误原因

在枚举类定义阶段,TWO、FOUR、SIX这些成员还只是你定义的元组(比如(2, "Two Days")),并未被转换为DaysEnum的枚举实例,因此直接使用位或操作符|会触发TypeError——元组不支持该操作。

正确实现方式

方法一:直接使用组合后的数值

EVEN_DAYS是TWO | FOUR | SIX的组合,对应的位或结果为14,直接将该数值写入元组即可:

@unique
@verify(CONTINUOUS)
class DaysEnum(IntFlag):
    ONE = (1, "One Day")
    TWO = (2, "Two Days")
    THREE = (3, "Three Days")
    FOUR = (4, "Four Days")
    FIVE = (5, "Five Days")
    SIX = (6, "Six Days")
    SEVEN = (7, "Seven Days")
    EVEN_DAYS = (14, "Even Days")  # 2 | 4 | 6 = 14

    def __init__(self, value, label) -> None:
        self.label = label

    def __new__(cls, value: int, label: str):
        obj = int.__new__(cls, value)
        obj._value_ = value
        obj.label = label
        return obj

方法二:类定义完成后添加组合成员

如果不想硬编码数值,可在类初始化完成后,利用已生成的枚举实例组合,并手动设置label属性:

@unique
@verify(CONTINUOUS)
class DaysEnum(IntFlag):
    ONE = (1, "One Day")
    TWO = (2, "Two Days")
    THREE = (3, "Three Days")
    FOUR = (4, "Four Days")
    FIVE = (5, "Five Days")
    SIX = (6, "Six Days")
    SEVEN = (7, "Seven Days")

    def __init__(self, value, label) -> None:
        self.label = label

    def __new__(cls, value: int, label: str):
        obj = int.__new__(cls, value)
        obj._value_ = value
        obj.label = label
        return obj

# 类定义完成后添加组合成员
DaysEnum.EVEN_DAYS = DaysEnum.TWO | DaysEnum.FOUR | DaysEnum.SIX
DaysEnum.EVEN_DAYS.label = "Even Days"

说明

  • 方法一简洁直接,适合组合逻辑固定、数值明确的场景;
  • 方法二更灵活,避免硬编码数值,适合后续可能调整成员值的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:58:23