Python枚举:如何获取具有多个属性的枚举值

Python Enum: How to get enum values with multiple attributes

我定义了两个带有属性的枚举。当我想通过指定其属性来访问枚举元素时,它适用于枚举 A (一个属性)但不适用于枚举 B (两个属性):

from enum import Enum

class A(Enum):
    ValOne = ('One')
    ValTwo = ('Two')

    def __init__(self, num):
        self.num = num

class B(Enum):
    ValOne = ('Val', 'One')
    ValTwo = ('Val', 'Two')

    def __init__(self, val, num):
        self.val = val
        self.num = num

print(A('One'))
print(B('Val', 'One'))

我得到以下输出:

A.ValOne
Traceback (most recent call last):
  File "test.py", line 19, in <module>
    print(B('Val', 'One'))
  File "/usr/lib/python3.8/enum.py", line 341, in __call__
    return cls._create_(
  File "/usr/lib/python3.8/enum.py", line 444, in _create_
    _, first_enum = cls._get_mixins_(cls, bases)
  File "/usr/lib/python3.8/enum.py", line 576, in _get_mixins_
    raise TypeError("Cannot extend enumerations")
TypeError: Cannot extend enumerations

我在这里错过了什么?

正确的语法是 B(('Val', 'One')),直接传递枚举的值(因此在本例中是一个元组),或者简单地按名称命名枚举变体:B.ValOne.

我必须承认这令人困惑,__init__ 自动将元组解构为两个参数。该错误也无济于事。

你错过的最重要的事情是 ('One') 不是 tuple -- 你需要一个逗号 (,),它看起来像 ('One', )

因此 A 由单个 non-tuple、值 'One''Two' 组成。

然而,

B是由元组构成的,but

 B('Val', 'One')

不是将 tuple 传递给 B,而是传递两个参数:'Val''One'。正如@orlp 提到的,使用函数语法传递一个元组看起来像:

B(('Val', 'One'))

最后,在AB的成员定义中,不需要括号:

class A(Enum):
    ValOne = 'One'
    ValTwo = 'Two'

    def __init__(self, num):
        self.num = num


class B(Enum):
    ValOne = 'Val', 'One'
    ValTwo = 'Val', 'Two'

    def __init__(self, val, num):
        self.val = val
        self.num = num