В вашем Release
Enum
есть несколько вещей, которые могут облегчить жизнь, первая из которых - это техника, показанная здесь :
def __new__(cls, value, cascade):
obj = object.__new__(cls)
obj._value_ = value
obj.current = ["Release" * value] # not sure what this should actually be
# if always the previous versions (don't need cascade defined)
obj.cascade = sorted(list(cls), reverse=True)
# if some already defined subset (need cascade defined)
obj.cascade = [cls._value2member_map_(c) for c in cascade]
return obj
Вторая техникаможет идти двумя путями - по умолчанию всегда первый Enum
член:
@classmethod
def get_all_releases(cls):
return list(cls[0]).current
или, если по умолчанию может быть любой член, то что-то похожее на этот ответ должно работать:
class add_default:
"""
add DEFAULT psuedo-member to enumeration; use first member if none specified
(default should be name of member)
"""
def __init__(self, default=''):
self._default = default
def __call__(self, enumeration):
if self._default:
member = enumeration[self._default]
else:
member = enumeration[enumeration._member_names_[0]]
enumeration._member_map_['DEFAULT'] = member
return enumeration
Ваш окончательный Enum
будет выглядеть так (при условии, что cascade
- все предыдущие члены и использует подход декоратора):
@add_default('Canary')
class Release(Enum):
Canary = 1
Beta = 2
RC = 3
Stable = 4
def __new__(cls, value):
obj = object.__new__(cls)
obj._value_ = value
obj.current = ["Release" * value] # not sure what this should actually be or how it's calculated
obj.cascade = list(cls)[::-1]
return obj
@classmethod
def get_all_releases(cls, release: "Release" = None):
if release is None:
release = cls.DEFAULT
return release.current
и используется:
>>> Release.DEFAULT
<Release.Canary: 1>
>>> Release.get_all_releases()
['Release']
>>> Release.get_all_releases(Release.RC)
['ReleaseReleaseRelease']
Оригинальный ответ
Проблема, с которой вы столкнулись с вашим кодом, здесь:
class Release(Enum):
Canary = 1,
Включив эту дополнительную запятую, высделали значение для Canary
быть (1, )
. Удалите эту запятую, чтобы избавиться от исключения tuple
.