2017-12-21 1 views
1

나는 형태enum 값이 튜플 인 경우 문자열에서 enum 객체 가져 오기?

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

Enum을하고 난 JSON 문자열에서 유형 ItemType의 객체를 인스턴스화하는 것을 시도하고있다.

예를 들어 논리적으로 문자열 'Desc1'을 나타내는 ItemType을 얻고 싶습니다. 열거 형 값이 ITEM1 = 'Desc1' 인 경우 간단하게 ItemType('Desc1')을 수행 할 수 있습니다. 그러나 현재의 형식에서는 어떻게 조회 방법을 달성 할 수 있는지 잘 모르겠습니다.

이 방법이 있습니까?

+0

사전을 사용하십시오. – kindall

+0

'class' 또는'Enum'의 값 대신에? – KDecker

+0

또 다른 열거 형'Desc'를 사용하면'ItemType (Desc ('Desc1'))' – smac89

답변

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') 그냥 파이썬 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에 대체 생성자가 있어야합니다 ... 아니면 둘 다 ...?

관련 문제