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

时间:2016-03-24 17:58:51

标签: 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"

但是

fruit = Fruits.APPLE
print fruit.__unicode__()

给出

AttributeError: 'unicode' object has no attribute '__unicode__'

此外必须有一种更优雅的方式来做这件事

如何做得更好?

2 个答案:

答案 0 :(得分:4)

一些观察结果:

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

  • 我无法复制您的问题

使用stdlib Enum(3.4+)或enum34 backport(Python 2.x),你必须以艰难的方式去做 - 制作你自己的基础Enum类:< / p>

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'

并在使用中:

>>> fruit = Fruits.APPLE
>>> unicode(fruit)
u'Crunchy Apple'

如果你可以使用aenum library 1 ,你将会更容易:

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

并在使用中:

fruit = Fruits.APPLE
fruit.describe()

请注意,由于{3}是Python 3中的默认值,因此我将名称更改为unicode

1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者。

答案 1 :(得分:-1)

enum34模块有你想要的。

from enum import Enum

class Fruits(Enum):
    apple = 'A'
    pear = 'P'
    banana = 'B'

fruit = Fruits.apple

print fruit.value
>> 'A'

可能更好的是使用整数

from enum import Enum

class Fruits(Enum):
    apple = 1
    pear = 2
    banana = 3

fruit = Fruits.apple

print fruit.value
>> 1

如果您使用以下方法获取对象(例如,来自数据库),则重新创建对象:

fruit = Fruits(1)