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'))
最后,在A
和B
的成员定义中,不需要括号:
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
我定义了两个带有属性的枚举。当我想通过指定其属性来访问枚举元素时,它适用于枚举 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'))
最后,在A
和B
的成员定义中,不需要括号:
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