Это своего рода продолжение Почему изменяемые значения в Python перечисляет один и тот же объект?.
Если значения Enum
являются изменяемыми (например, list
s и т. д.), эти значения можно изменить в любое время. Я думаю, что это создает некоторую проблему, если элементы 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 это нормально, подразумевая, что пользователи могут использовать mutables в качестве своих Enum
значений, но просто чтобы понять, какие черви они могут открыть .
Однако это поднимает вторую проблему: поскольку вы можете искать член Enum
по значению, а значение может быть изменяемым, он должен выполнять поиск с помощью средств, отличных от хэш-карты/dict
, поскольку изменяемый элемент не может быть key
в такой dict
.
Не было бы более эффективным (хотя и менее гибким) ограничить значения Enum
только неизменяемыми типами, чтобы поиск по значению можно было реализовать с помощью dict
?