gpt4 book ai didi

具有重复值的 Python 枚举

转载 作者:太空狗 更新时间:2023-10-30 00:44:18 25 4
gpt4 key购买 nike

我在处理某些属性具有相同值的枚举时遇到问题。我认为枚举对 python 来说太新了,我找不到任何其他关于这个问题的引用。无论如何,假设我有以下内容

class CardNumber(Enum):
ACE = 11
TWO = 2
THREE = 3
FOUR = 4
FIVE = 5
SIX = 6
SEVEN = 7
EIGHT = 8
NINE = 9
TEN = 10
JACK = 10
QUEEN = 10
KING = 10

很明显,这些是黑 jack 中的卡号及其对应的值。十通王具有相同的值(value)。但是如果我做类似 print(CardNumber.QUEEN) 的事情,我回来了<CardNumber.TEN: 10> .更重要的是,如果我迭代这些,它只是迭代唯一值。

>>> for elem in CardNumber:
... print(elem)
CardNumber.ACE
CardNumber.TWO
CardNumber.THREE
CardNumber.FOUR
CardNumber.FIVE
CardNumber.SIX
CardNumber.SEVEN
CardNumber.EIGHT
CardNumber.NINE
CardNumber.TEN

我该如何解决这个问题?我希望 CardNumber.QUEEN 和 CardNumber.TEN 是唯一的,并且都出现在任何迭代中。我唯一能想到的就是给每个属性一个第二个值,作为一个独特的 id,但这似乎不符合 pythonic。

最佳答案

更新

使用 aenum 1 你有几个选择:

  • 改用 NamedConstant:不提供任何 Enum 额外功能(迭代、查找等)[参见:下面的原始答案]

  • 使用 NoAlias:具有所有正常的 Enum 行为,除了每个成员都是唯一的并且按值查找不可用

NoAlias 示例:

from aenum import Enum, NoAlias

class CardNumber(Enum):

_order_ = 'EIGHT NINE TEN JACK QUEEN KING ACE' # only needed for Python 2.x
_settings_ = NoAlias

EIGHT = 8
NINE = 9
TEN = 10
JACK = 10
QUEEN = 10
KING = 10
ACE = 11

并在使用中:

>>> list(CardNumber)
[<CardNumber.EIGHT: 8>, <CardNumber.NINE: 9>, <CardNumber.TEN: 10>, <CardNumber.JACK: 10>, <CardNumber.QUEEN: 10>, <CardNumber.KING: 10>, <CardNumber.ACE: 11>]

>>> CardNumber.QUEEN == CardNumber.KING
False

>>> CardNumber.QUEEN is CardNumber.KING
False

>>> CardNumber.QUEEN.value == CardNumber.KING.value
True

>>> CardNumber(8)
Traceback (most recent call last):
...
TypeError: NoAlias enumerations cannot be looked up by value

原始答案

如果您想要命名常量并且不关心Enum 的其他特性,您可以使用aenum library 中的NamedConstant 类。 :

from aenum import NamedConstant

class CardNumber(NamedConstant):
ACE = 11
TWO = 2
THREE = 3
FOUR = 4
FIVE = 5
SIX = 6
SEVEN = 7
EIGHT = 8
NINE = 9
TEN = 10
JACK = 10
QUEEN = 10
KING = 10

重复值仍然不同:

>>> CardNumber.TEN is CardNumber.JACK
False

>>> CardNumber.TEN == CardNumber.JACK
True

>>> CardNumber.TEN == 10
True

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

关于具有重复值的 Python 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31537316/

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