如何在值为元组时组合标志的成员

0 投票
1 回答
43 浏览
提问于 2025-04-14 16:41

我定义了一个叫做 Flag 的枚举,代码是这样的:

@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 = (TWO | FOUR | SIX, "Even 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

根据 Python 的文档,当我从 enum.Flag 这个类继承时,可以把枚举的成员组合在一起。但是运行这段代码时,我遇到了一个错误:TypeError: unsupported operand type(s) for |: 'tuple' and 'tuple'. 看起来我定义成员 EVEN_DAYS 的语法有问题。

那么,考虑到 DaysEnum 的值是元组,正确的语法应该是什么样的,才能组合 EVEN_DAYS 的成员呢?

1 个回答

0

顺便提一下,你不需要用到 __init__,因为你在 __new__ 里已经设置了 .label

你遇到的问题是,像 ONETWO 这些名字在解析的时候其实只是元组(tuple)——它们在整个类解析完成之前并不会从元组变成成员。

换句话说,EVEN_DAYS = TWO | FOUR | SIX 这行代码在创建标志之后是可以工作的,但在创建过程中是不行的。

撰写回答