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:如何让枚举成员表现得像零一样?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 list_blob 表现得像 gsutil

Python 的枚举 Enum

Python枚举的定义和使用(enum)

如何以半自动方式迁移 SQLAlchemy for PostgreSQL 中的新 Python Enum 成员?

python3 enum模块

Python枚举类