2017-12-21 2 views
1

私は、フォームのEnum列挙型の値がタプルの場合、列挙型のオブジェクトを文字列から取得しますか?

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

を持っていると私は、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')は、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の変換に固有の場合は、代わりにコンストラクタを使用してください。さもなければ、確かに、この第2のオプションのために行きなさい。しかし、その場合には、その値が関連するものを保存する最も良い場所であるかどうか疑問に思うでしょうAnotherEnum。代わりにto_another_enum()というメソッド、AnotherEnumの代替コンストラクタ、またはその両方を持つべきでしょうか?

関連する問題