返回两个枚举状态
假设我有
class State(Enum):
TAKEPROFIT = 1
STOPPEDOUT = 2
WINNER = 3
LOSER = 4
我该如何返回例如 State.STOPPEDOUT
和 State.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的回答是正确的,但更“正确”的做法是继承自IntFlag
(auto()
会生成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
IntFlag
是int
和Flag
的子类(而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