Один из возможных способов - сделать перечисление Flag
вместо этого:
from enum import Flag, auto
class Skill(Flag):
Might = auto()
Wisdom = auto()
Cunning = auto()
Doubled = auto()
и использовать:
>>> for i in (1, 2, 4, 9, 10, 12):
... i, Skill(i)
(1, <Skill.Might: 1>)
(2, <Skill.Wisdom: 2>)
(4, <Skill.Cunning: 4>)
(9, <Skill.Doubled|Might: 9>)
(10, <Skill.Doubled|Wisdom: 10>)
(12, <Skill.Doubled|Cunning: 12>)
Если вы хотите красивее str()
(или один для объединенного члена), вы можете добавить свой собственный __str__
:
class Skill(Flag):
Might = auto()
Wisdom = auto()
Cunning = auto()
Doubled = auto()
#
def __str__(self):
cls = self.__class__
cls_name = cls.__name__
doubled = (self & cls.Doubled or "") and " x2"
base = (self & ~cls.Doubled) or self
name = base.name
if name is None:
name = '|'.join(s.name for s in Skill if s & base)
return "%s.%s%s" % (cls_name, name, doubled)
и использовать:
for i in (1, 2, 4, 9, 10, 12):
i, str(Skill(i))
(1, 'Skill.Might')
(2, 'Skill.Wisdom')
(4, 'Skill.Cunning')
(9, 'Skill.Might x2')
(10, 'Skill.Wisdom x2')
(12, 'Skill.Cunning x2')