Python元组和枚举的区别

11

我在尝试使用Python中的枚举时遇到了以下错误:

当我将枚举作为元组并给它两个值时,我无法仅访问一个值,例如tuple[0]

class Rank(Enum):
    ACE = 1
    TWO = 2
    THREE = 3
    FOUR = 4
    FIVE = 5
    SIX = 6
    SEVEN = 7
    EIGHT = 8
    NINE = 9
    TEN = 10
    JACK = 11
    QUEEN = 12
    KING = 13, "King"

print (Rank.KING.value)

并且打印结果为

(13, 'King')

我该如何访问其中一个值,以便打印出13或'King'?

5个回答

15
使用enum.Enum,类变量的名称本身成为Enum实例的枚举属性的name属性,因此您不必将KING作为值和名称的元组。
class Rank(Enum):
    King = 13

print(Rank.King.name) # outputs 'King'
print(Rank.King.value) # outputs 13

如果你想用大写字母命名类变量,但希望它们的"name"值是混合大小写的,这并不是"Enum"设计的用途。你需要继承"Enum"类,并自己重写"name"方法来自定义行为。
from enum import Enum
from types import DynamicClassAttribute

class MixedCaseEnum(Enum):
    @DynamicClassAttribute
    def name(self):
        return self._name_.title()

class Rank(MixedCaseEnum):
    KING = 13

print(Rank.KING.name) # outputs 'King'
print(Rank.KING.value) # outputs 13

12

您有以下途径可以访问13或“king”:

Rank.KING.value[0]
Rank.KING.value[1]

8

现有的答案都没有解释如何在枚举中包含三个或更多的值,如果你想要的话。

例如,假设最初的提问者想要在枚举中包含 (13, "K", "king"),可以按照以下方式实现:


class Rank(Enum):
    K = 13, "King"

    def __init__(self, rank, label):
        self.rank = rank
        self.label = label

__init__方法接受值并将其分配给枚举成员。这意味着Rank.K.rank返回13Rank.K.label返回“King”。

虽然在此示例中不是必需的,但在Enum上存储更多的键/值对可能很有用。

请注意,Rank.K.value仍然存在,并返回元组(13,“King”)


1
谢谢你的回答。我意识到一个问题,就是你不能定义一个成员name,因为它会与Enum.name冲突。就像Rank.K.value仍然存在一样,Rank.K.name也是如此。 - Ramon Dias

2
您可以像在数组上使用索引一样使用它们:
最初的回答
>>> KING = 13, 'King'
>>> KING
(13, 'King')
>>> KING[0]
13
>>> KING[1]
'King'
>>> 

0

如果你想保留 .value 的初始功能,你可以使用 Enum.__new__()

class Rank(int, Enum):
    QUEEN = 12
    KING = 13, 'King'

    def __new__(cls, value, label='...'):
        obj = int.__new__(cls, value)
        obj._value_ = value
        obj.label = label
        return obj

print(Rank.QUEEN.label)
print(Rank.KING.label)

文档:https://docs.python.org/3/howto/enum.html#when-to-use-new-vs-init


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接