gpt4 book ai didi

python 2 : What is the most elegant/pythonic way of doing a enum with string interpretations?

转载 作者:行者123 更新时间:2023-11-30 22:58:24 27 4
gpt4 key购买 nike

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

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__'

此外,还必须有一种更优雅的方法

如何做得更好?

最佳答案

一些观察结果:

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

  • 我无法重现您的问题

使用stdlib Enum (3.4+) 或enum34 backport (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'

正在使用:

>>> 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()

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

<小时/>

1 披露:我是 Python stdlib Enum 的作者,enum34 backport ,以及 Advanced Enumeration (aenum)图书馆。

关于 python 2 : What is the most elegant/pythonic way of doing a enum with string interpretations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com