Python Enum:如何让枚举成员表现得像零一样?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Enum:如何让枚举成员表现得像零一样?相关的知识,希望对你有一定的参考价值。
我有枚举,我想要一些常量就像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 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_)
以上是关于Python Enum:如何让枚举成员表现得像零一样?的主要内容,如果未能解决你的问题,请参考以下文章