【发布时间】:2017-04-01 04:26:45
【问题描述】:
这有点像Why are mutable values in Python Enums the same object? 的后续。
如果Enum 的值是可变的(例如lists 等),则可以随时更改这些值。我认为如果 Enum 成员是按值检索的,这会带来一些问题,特别是如果有人无意中更改了他查找的 Enum 的值:
>>> from enum import Enum
>>> class Color(Enum):
black = [1,2]
blue = [1,2,3]
>>> val_1 = [1,2]
>>> val_2 = [1,2,3]
>>> Color(val_1)
<Color.black: [1, 2]>
>>> Color(val_2)
<Color.blue: [1, 2, 3]>
>>> my_color = Color(val_1)
>>> my_color.value.append(3)
>>> Color(val_2)
<Color.black: [1, 2, 3]>
>>> Color(val_1)
Traceback (most recent call last):
...
ValueError: [1, 2] is not a valid Color
我认为对于普通的 Python 习语来说,这是好的,这意味着用户可以使用可变变量作为他们的Enum 值,但只是为了理解他们可能会打开蠕虫。
然而这带来了第二个问题 - 因为您可以按值查找 Enum 成员,并且该值可以是可变的,所以它必须通过 hashmap/dict 以外的方式进行查找,因为在这样的dict 中,可变对象不能是key。
将Enum 值限制为仅不可变类型以便可以使用dict 实现按值查找不是更有效(虽然,但不太灵活)吗?
【问题讨论】:
标签: python python-3.x dictionary enums hashable