【问题标题】:Python equivalent of C# Enum.HasFlagPython 等效于 C# Enum.HasFlag
【发布时间】:2014-10-20 13:20:47
【问题描述】:

让我们在 python 中说

StateA = 1
StateB = 2
StateC = StateA | StateB

...
instance.state = StateA

在 C# 中 Enum 中有一个 HasFlag 函数,它告诉我一个对象的标志是 StateC 的一部分

python中是否有等效版本?

现在我只能(作为按位新手)想到这一点,甚至不确定它是否应该工作:

if instance.state | StateC == StateC:
    # yes in StateC

【问题讨论】:

    标签: python enums


    【解决方案1】:

    Python 3.4 有一个Enum data type,即has been backported

    from enum import Enum
    
    class States(Enum):
        StateA = 1
        StateB = 2
        StateC = StateA | StateB
        def has_flag(self, flag):
            return self.value & flag.value
    
    if States.StateC.has_flag(States.StateA):
        print("yup, it's there!")
    

    Python 3.6 具有(Int)Flag data type,它也存在于the aenum1 library

    from enum import Flag  # or from aenum import Flag
    
    class States(Flag):
        StateA = 1
        StateB = 2
        StateC = StateA | StateB
    
    if States.StateA in States.StateC:
        print("yup, it's there!")
    

    1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。

    【讨论】:

      【解决方案2】:

      HasFlag基本上是按位运算。

      >>> a = 0b01
      >>> b = 0b10
      >>> "{0:b}".format(a | b,)
      '11'
      >>> def has_flag(v, flag): return v & flag == flag
      ...
      >>> has_flag(0b111, a)
      True
      >>> has_flag(0b111, a|b)
      True
      >>> has_flag(0b1, a|b)
      False
      

      【讨论】:

        【解决方案3】:

        测试标志:

        value & flag == flag
        

        添加标志:

        value |= flag
        

        清旗:

        value &= ~flag
        

        【讨论】:

          猜你喜欢
          • 2018-12-26
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          • 2015-03-29
          • 2011-01-23
          • 2016-08-13
          • 2012-06-28
          • 2017-08-02
          相关资源
          最近更新 更多