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

KDe*_*ker 2 python enums

我有这样Enum的形式

class ItemType(Enum):
    ITEM1 = ('Desc1', AnotherEnum.ONE)
    ITEM2 = ('Desc2', AnotherEnum.TWO)
Run Code Online (Sandbox Code Playgroud)

我正在尝试ItemType从 JSON 字符串实例化该类型的对象。

例如,我想获得ItemType逻辑上代表字符串的'Desc1'。如果枚举值是ITEM1 = 'Desc1'我可以简单做的形式ItemType('Desc1')。但是在当前的形式中,我不确定如何实现查找方法。

有没有办法做到这一点?

Thi*_*ien 7

AnEnum只是 a 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__))
Run Code Online (Sandbox Code Playgroud)

然后就可以了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)
Run Code Online (Sandbox Code Playgroud)

我会根据描述查找是否是一件自然而然的事情来做出选择。如果它特定于翻译 JSON,请坚持使用备用构造函数。否则,当然,请选择第二个选项。但是,在这种情况下,我想知道该值是否是存储相关AnotherEnum. 也许你应该有一个方法to_another_enum(),一个替代的构造函数AnotherEnum,或者两者都有......?