gpt4 book ai didi

python - 在 Python 2 中是否有更简单的 Enum 成员排序方法?

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:23 25 4
gpt4 key购买 nike

我在一个项目中坚持使用 Python 2.7,并且我有几个 Enum 用于将 Python 框架 (OpenERP) 与遗留框架集成。在 Python 2 中,Enums are not ordered默认情况下:

>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> list(Color)
[<Color.BLUE: 3>, <Color.RED: 1>, <Color.GREEN: 2>]

如果顺序很重要,则必须手动添加 _order_ = 'member1, member2, member3' 属性。

>>> class Color(Enum):
... _order_ = 'RED GREEN BLUE'
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]

这适用于较小的 Enum,但我有几个有 10 到 50 个名称,这实在太多了,无法在添加名称时键入或读取或保持顺序/已删除。

还有其他选择吗?

最佳答案

aenum 2.1.21 开始,_order_ 属性可以是一个函数;此函数将用作 sort()key 以正确排列 Enum 成员:

from aenum import Enum

class Pres(str, Enum):

_init_ = 'value, precedence' # footnote 2
_order_ = lambda m: m.precedence # footnote 3

PRESIDENT = 'president', 1
COUNSELOR_1 = 'first counselor', 2
COUNSELOR_2 = 'second counselor', 3
SECRETARY = 'secretary', 4

def __repr__(self):
"added so example below is clearer"
return '<%s.%s>' % (self.__class__.__name__, self.name)

并在使用中:

>>> list(Pres)
[<Pres.PRESIDENT>, <Pres.COUNSELOR_1>, <Pres.COUNSELOR_2>, <Pres.SECRETARY>]

虽然我不会称这个下一个版本更容易,但如果您不能使用 aenum,并且不想尝试维护一个巨大的 _order_,它可以使用 Functional API :

Pres = Enum('Pres', (
('PRESIDENT', 'president'), # comment here
('COUNSELOR_1', 'first counselor'), # more comments here
('COUNSELOR_2', 'second counselor'), # you get the idea ;)
('SECRETARY', 'secretary'),
),
type=str,
)

def pres_repr(self):
"added so example below is clearer"
return '<%s.%s>' % (self.__class__.__name__, self.name)

Pres.__repr__ = pres_repr

丑陋,但它有效。但是,如果需要 precedence 字段,它将不起作用。


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

2 _init_ 在这种情况下是必需的,因为我不希望将 precedence 值传递给 str构造函数。

3 关键函数将被赋予一个参数:

  • 没有 _init_ -> (name, value) 的元组,其中 value 也可以是一个元组(在上面的例子中)
  • with _init_ -> 一个 aenum.NamedTuple 字段 name 加上 _init_ 中的任何字段(所以name, value, and precedence 在上面的例子中)

关于python - 在 Python 2 中是否有更简单的 Enum 成员排序方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50049102/

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