Eine Enum
ist nur eine class
, also wie wäre es mit einem alternativen Konstruktor? Es ist das expliziteste.
class ItemType(Enum):
ITEM1 = ('Desc1', AnotherEnum.ONE)
ITEM2 = ('Desc2', AnotherEnum.TWO)
@classmethod
def from_description(cls, description):
for item in cls:
if item.value[0] == description:
return item
raise ValueError("%r is not a valid %s description" % (description, cls.__name__))
Sie können dann ItemType.from_description('Desc1')
tun.
Alternativ, wenn Sie ItemType('Desc1')
wollen arbeiten, nur um, wie von Python 3.6 Sie können _missing_
implementieren:
class ItemType(Enum):
ITEM1 = ('Desc1', AnotherEnum.ONE)
ITEM2 = ('Desc2', AnotherEnum.TWO)
@classmethod
def _missing_(cls, value):
for item in cls:
if item.value[0] == value:
return item
return super()._missing_(value)
ich meine Wahl auf Basis würde, ob durch die Beschreibung auf der Suche ist eine natürliche Sache zu tun oder nicht . Wenn es spezifisch für die Übersetzung von JSON ist, bleiben Sie lieber beim alternativen Konstruktor. Ansonsten, sicher, gehen Sie für diese zweite Option. In diesem Fall würde ich mich jedoch fragen, ob der Wert der beste Ort ist, um die zugehörige AnotherEnum
zu speichern. Vielleicht sollten Sie stattdessen eine Methode to_another_enum()
, einen alternativen Konstruktor auf AnotherEnum
, oder beides haben ...?
Verwenden Sie ein Wörterbuch. – kindall
Anstelle der 'Klasse' oder der Werte der' Enum'? – KDecker
Verwenden Sie eine andere Enumeration namens 'Desc ', dann können Sie' ItemType (Desc (' Desc1 ')) ' – smac89