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

问题描述 投票:1回答:1

我有枚举,我想要一些常量就像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!'
python python-2.7 enums
1个回答
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_)
© www.soinside.com 2019 - 2024. All rights reserved.