Python Enum:如何让枚举成员表现得像零一样?

时间:2018-03-03 13:37:28

标签: python python-2.7 enums

我有枚举,我喜欢一些像0这样的常量。默认情况并非如此(这本身就很奇怪)。我试图直接将非零方法绑定到枚举成员,但如果是statment则不会调用它。到底是怎么回事!?有没有明确的方法让FOO表现得像0?

from enum import Enum

class A(Enum):
    FOO = 0
    BAR = 1

if A.FOO: print 'foo!'
if A.BAR: print 'bar!'

setattr(A.FOO, '__nonzero__', (lambda self:False).__get__(A.FOO, A.FOO.__class__))

if A.FOO: print 'foo!'
print A.FOO.__nonzero__()

输出

foo!
bar!
foo!
False

更新:对于Python 2.7,zvone的解决方案看起来像这样并且工作正常:

from enum import Enum

class A(Enum):
    FOO = 0
    BAR = 1

    def __nonzero__(self): return self!=A.FOO

if A.FOO: print 'foo!'
if A.BAR: print 'bar!'

1 个答案:

答案 0 :(得分:2)

这里有几个问题:

  • Python 2.7中没有enum(问题标记为2.7) - 请参阅enum doc;也许您正在使用enum34 backport?
  • Python 3.4及更高版本中有enum,但那里没有__nonzero__(Python 3使用__bool__代替)
  • __nonzero__ / __bool__方法(如果存在)必须在类上定义,而不是在实例上定义

所以,最后,Python 3中有一个解决方案:

class A(Enum):
    FOO = 0
    BAR = 1

    def __bool__(self):
         # only return False for A.FOO
         return self != A.FOO

Python 2的解决方案:

class A(Enum):
    FOO = 0
    BAR = 1

    def __nonzero__(self):
         # return boolean value of any A
         return bool(self._value_)