我有一个包含 4 个元素的小型枚举列表(class Type(Enum): One,Two,Three,Four
),我想知道是否有一种方法可以将枚举与全局列表 (List = [Type(0),Type(1),Type(2),Type(3)
]。
我知道我可以使用语法 List[ Type.Two.value ]
访问此列表。但我希望有一种简单的方法可以丢失.value
。这不是打字问题 - 我不介意输入长的描述性变量名称。但列表和枚举是直接相关/关联的,因此如果列表将枚举视为迭代器,那就更好了。有没有简单的方法可以实现这一点?
我正在 Blender 环境中工作,构建一个附加组件,如果这有什么区别的话。我对 python 也很陌生——大约一周了,所以如果你有明显的要点,请不要忽略它们。
我对C/C++非常熟悉,以防有任何相似之处。我非常喜欢创建数据库列表并关联迭代器类型,这种方式阻止使用除与其关联的索引类型名以外的任何内容访问列表(因此您不会犯像 Cars[my_boat_index] 这样的错误
)
感谢任何建议!
最佳答案
将 Enum
转换为列表非常简单:
list(Type)
# [<Type.ONE: 1>, <Type.TWO: 2>, <Type.THREE: 3>, <Type.FOUR: 4>]
使用 Type
成员作为索引访问列表有点复杂:
- 默认情况下,成员值从 1 开始
- 但容器索引从 0 开始
- 并且成员没有
__index__
和__int__
方法
简单/简单的解决方案有两个:
- 使用
IntEnum
而不是Enum
- 从
0
开始计数
所以:
class Type(IntEnum):
ZERO = 0
ONE = 1
TWO = 2
THREE = 3
IntEnum
成员可以在 int
所在的任何地方使用,因此它们可以很好地用作索引值。
更复杂的解决方案是使用常规的Enum
,添加您需要的方法,并在返回值时减1:
class Type(Enum):
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
def __index__(self):
return self.value - 1
def __int__(self):
return self.value - 1
即使您添加了 __index__
和 __int__
方法,您仍然应该从零开始计数,而不是执行减一技巧,因为这会导致更多当您习惯了 Python 的工作方式后会遇到问题。
关于python - 基于Enum迭代或索引列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57949252/