返回两个枚举状态

0 投票
3 回答
47 浏览
提问于 2025-04-14 15:41

假设我有

class State(Enum):
    TAKEPROFIT  = 1
    STOPPEDOUT  = 2
    WINNER      = 3
    LOSER       = 4

我该如何返回例如 State.STOPPEDOUTState.LOSER 的组合呢?
使用 | 似乎不被支持:

return State.STOPPEDOUT | State.LOSER

抛出

TypeError: unsupported operand type(s) for |: 'State' and 'State'

3 个回答

0

枚举(Enums)有一个值属性:

class State(Enum):
    TAKEPROFIT  = 1
    STOPPEDOUT  = 2
    WINNER      = 3
    LOSER       = 4

State.STOPPEDOUT.value | State.LOSER.value # 6
3

虽然@larsks的回答是正确的,但更“正确”的做法是继承自IntFlagauto()会生成2的幂值;如果你愿意,也可以使用自己的值):

from enum import IntFlag, auto

class State(IntFlag):
  TAKEPROFIT = auto()
  STOPPEDOUT = auto()
  WINNER = auto()
  LOSER = auto()

|&^这些操作会产生同一类的实例:

>>> State.STOPPEDOUT | State.LOSER
<State.STOPPEDOUT|LOSER: 10>
>>> State.STOPPEDOUT & State.LOSER
<State: 0>
>>> State.STOPPEDOUT ^ (State.LOSER | State.STOPPEDOUT | State.TAKEPROFIT)
<State.TAKEPROFIT|LOSER: 9>

in操作也是支持的:

>>> State.STOPPEDOUT in (State.STOPPEDOUT | State.LOSER)
True

IntFlagintFlag的子类(而Flag又是Enum的子类),因此它的实例可以在任何需要int的地方使用:

>>> State.WINNER + 9
13

需要注意的是,如果一个IntFlag被取反,它会返回其他标志的并集:

>>> ~State.TAKEPROFIT
<State.STOPPEDOUT|WINNER|LOSER: 14>
4

使用 IntEnum 而不是 Enum

from enum import IntEnum


class State(IntEnum):
    TAKEPROFIT = 1
    STOPPEDOUT = 2
    WINNER = 3
    LOSER = 4

IntEnum 的表现就像一个 int(整数),所以:

>>> State.STOPPEDOUT | State.LOSER
6

撰写回答