如何在Python中使用位标志?

3
from enum import Enum

class InputTypes(Enum):
    """
    Flags to represent the different kinds of input we
    are acting on from the user
    """
    KEYBOARD = 0b00000001,
    MOUSE_BUTTONS = 0b00000010,
    MOUSE_MOVE = 0b00000100,
    ALL = 0b11111111


if __name__ == "__main__":
    x = (InputTypes.KEYBOARD | InputTypes.MOUSE_BUTTONS)

我遇到了一个错误:

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

如何在Python 2.7和Python 3中正确定义一些标志并使用它们?

3个回答

5
对于Python 2,您需要使用aenum(高级枚举)1。如果数字值不重要,可以使用Flag
from aenum import Flag, auto

class InputTypes(Flag):
    """
    Flags to represent the different kinds of input we
    are acting on from the user
    """
    KEYBOARD = auto()
    MOUSE_BUTTONS = auto()
    MOUSE_MOVE = auto()
    ALL = KEYBOARD | MOUSE_BUTTONS | MOUSE_MOVE

如果这些值很重要(也就是说你会将它们用作整数),那么请使用 IntFlag

1声明:本人是Python标准库中Enum, enum34回溯,以及高级枚举(aenum) 库的作者。


2
Enum基类重写了类变量访问,使其返回子类本身的实例。如果您不对Enum进行子类化(并删除逗号),则代码不会崩溃。
请注意,您可以使用Enum条目集而不是位图来使用InputTypes(Enum)获得相同的结果。
最初的回答:Enum基类修改了类变量的访问方式,使其能够返回子类本身的实例。如果您不对Enum进行子类化(并且去除逗号),您的代码将不会崩溃。请注意,您可以使用Enum条目集代替位图来使用InputTypes(Enum)获得相同的结果。

2

你可以使用IntFlag,而不是基本的Enum

最初的回答:

from enum import IntFlag
class InputTypes(IntFlag):
    # Rest of your code

我的解释器似乎找不到IntFlag。那是Python3的解决方案吗?我们如何在2.7中实现它? - Christopher Pisz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接