2017-12-21 1 views
1

Ich habe Enum der FormEnum-Objekt von String erhalten, wenn Enum-Werte Tupel sind?

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

und ich versuche, ein Objekt des Typs ItemType aus einer JSON-Zeichenfolge zu instanziieren.

Zum Beispiel möchte ich die ItemType erhalten, die logisch die Zeichenfolge 'Desc1' darstellt. Wenn die Enum-Werte die Form hätten, könnte ich einfach ItemType('Desc1') tun. Aber in der aktuellen Form bin ich mir nicht sicher, wie ich die Lookup-Methode erreichen könnte.

Gibt es eine Möglichkeit, dies zu tun?

+0

Verwenden Sie ein Wörterbuch. – kindall

+0

Anstelle der 'Klasse' oder der Werte der' Enum'? – KDecker

+0

Verwenden Sie eine andere Enumeration namens 'Desc ', dann können Sie' ItemType (Desc (' Desc1 ')) ' – smac89

Antwort

2

Eine Enum ist nur eine class, also wie wäre es mit einem alternativen Konstruktor? Es ist das expliziteste.

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__)) 

Sie können dann ItemType.from_description('Desc1') tun.

Alternativ, wenn Sie ItemType('Desc1') wollen arbeiten, nur um, wie von Python 3.6 Sie können _missing_ implementieren:

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) 

ich meine Wahl auf Basis würde, ob durch die Beschreibung auf der Suche ist eine natürliche Sache zu tun oder nicht . Wenn es spezifisch für die Übersetzung von JSON ist, bleiben Sie lieber beim alternativen Konstruktor. Ansonsten, sicher, gehen Sie für diese zweite Option. In diesem Fall würde ich mich jedoch fragen, ob der Wert der beste Ort ist, um die zugehörige AnotherEnum zu speichern. Vielleicht sollten Sie stattdessen eine Methode to_another_enum(), einen alternativen Konstruktor auf AnotherEnum, oder beides haben ...?

Verwandte Themen