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

