Python 2:使用字符串解释进行枚举的最优雅/Pythonic 方法是什么?

Dig*_*tal 2 python enums

我想要一个带有预定义的单字符常量(适合存储在数据库中)和字符串解释的枚举。这是我的想法:

class Fruits(Enum):
    APPLE = 'A'
    PEAR = 'P'
    BANANA = 'B'
    def __unicode__(self):
        if self == APPLE: return "Crunchy Apple"
        if self == PEAR: return "Sweet Pear"
        if self == BANANA: return "Long Banana"
Run Code Online (Sandbox Code Playgroud)

fruit = Fruits.APPLE
print fruit.__unicode__()
Run Code Online (Sandbox Code Playgroud)

给出

AttributeError: 'unicode' object has no attribute '__unicode__'
Run Code Online (Sandbox Code Playgroud)

除此之外,还必须有一种更优雅的方式来做到这一点

怎样才能做得更好呢?

Eth*_*man 5

一些观察:

  • 你不应该__dunder__直接调用方法;而是使用匹配命令:unicode而不是__unicode__

  • 我无法重现您的问题

使用stdlibEnum (3.4+) 或enum34向后移植(Python 2.x),您将不得不以困难的方式做到这一点——创建您自己的基Enum类:

class EnumWithDescription(Enum):
    def __new__(cls, value, desc):
        member = object.__new__(cls)
        member._value_ = value
        member.description = desc
        return member
    def __unicode__(self):
        return self.description

class Fruits(EnumWithDescription):
    _order_ = 'APPLE PEAR BANANA'   # if using Python 2.x and order matters
    APPLE = 'A', 'Crunchy Apple'
    PEAR = 'P', 'Sweet Pear'
    BANANA = 'B', 'Long Banana'
Run Code Online (Sandbox Code Playgroud)

并在使用中:

>>> fruit = Fruits.APPLE
>>> unicode(fruit)
u'Crunchy Apple'
Run Code Online (Sandbox Code Playgroud)

如果您可以使用1,您会更轻松:aenum library

from aenum import Enum

class Fruits(Enum, init='value description'):
    APPLE = 'A', 'Crunchy Apple'
    PEAR = 'P', 'Sweet Pear'
    BANANA = 'B', 'Long Banana'
    def describe(self):
        return self.description
Run Code Online (Sandbox Code Playgroud)

并在使用中:

fruit = Fruits.APPLE
fruit.describe()
Run Code Online (Sandbox Code Playgroud)

请注意,由于这unicode是 Python 3 中的默认名称,因此我将名称更改为describe.


1声明:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum)库的作者 。