我有Enum
表格
class ItemType(Enum):
ITEM1 = ('Desc1', AnotherEnum.ONE)
ITEM2 = ('Desc2', AnotherEnum.TWO)
我试图从JSON字符串中实例化ItemType
类型的对象。
例如,我希望得到逻辑上代表字符串ItemType
的{{1}}。如果枚举值的格式为'Desc1'
,我可以简单地ITEM1 = 'Desc1'
。但在目前的形式,我不知道如何实现查找方法。
有办法做到这一点吗?
答案 0 :(得分:2)
Enum
只是class
,那么备用构造函数怎么样?这是最明确的。
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__))
然后你可以ItemType.from_description('Desc1')
。
或者,如果您希望ItemType('Desc1')
正常工作,从Python 3.6开始,您可以实现_missing_
:
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)
我的选择取决于通过描述查找是否是自然而然的事情。如果它特定于翻译JSON,而是坚持使用备用构造函数。否则,当然,请选择第二个选项。但是,在这种情况下,我想知道该值是否是存储相关AnotherEnum
的最佳位置。也许你应该有一个方法to_another_enum()
,AnotherEnum
上的替代构造函数,或者两者都有......?