Python 3.11+enumфункция
enum.pickle_by_enum_name
pickle
Функция-редьюсер для pickle: сериализует член перечисления по паре (класс, имя члена) вместо значения — надёжнее при изменении значений.
Синтаксис
member.__reduce_ex__ = enum.pickle_by_enum_name
По умолчанию член перечисления пикуется по значению — в потоке фактически лежит вызов Colour(1). Если значения потом сдвинутся (особенно при auto()), старый pickle не упадёт, а тихо развернётся в другой член; хранение по имени такой ошибки не допускает. Присваивать редьюсер надо в теле класса перечисления: __reduce_ex__ = enum.pickle_by_enum_name.
Примеры
import enum
print(callable(enum.pickle_by_enum_name)) # → True
Color = enum.Enum('Color', 'RED GREEN')
print(Color.RED.__reduce_ex__(2)[1]) # → (1,)
func, args = enum.pickle_by_enum_name(Color.RED, 2)
print(func is getattr) # → True
print(args[1]) # → RED
print(func(*args) is Color.RED) # → True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности