当枚举值是元组时从字符串获取枚举对象?

问题描述 投票:1回答:1

我有形式的Enum

class ItemType(Enum):
    ITEM1 = ('Desc1', AnotherEnum.ONE)
    ITEM2 = ('Desc2', AnotherEnum.TWO)

我试图从JSON字符串实例化类型为ItemType的对象。

例如,我想得到ItemType逻辑上代表字符串'Desc1'。如果枚举值的形式为ITEM1 = 'Desc1',我可以简单地做ItemType('Desc1')。但在目前的形式,我不知道如何实现查找方法。

有没有办法做到这一点?

python enums
1个回答
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的替代构造函数,或两者......?

© www.soinside.com 2019 - 2024. All rights reserved.