2017-03-07 45 views
2

我有一個簡單Python2.7枚舉:Python的枚舉:不區分大小寫構造

from enum import Enum 
class Label(enum): 
    RedApple = 1 
    GreenApple = 2 

我想能夠使用不區分大小寫鍵創建枚舉對象:

fruitname = "redapple" 
a = Label[fruitname] 

我已經試圖創建一個__init__方法:

def __init__(self, key): 
    super(Label, self).__init__() 
    pass # do comparison here 

但繼續運行到錯誤:

super(Label, self).__init__() 
NameError: global name 'Label' is not defined 

我想對key.lower().strip()做一個比較。
這甚至可能嗎?

回答

2

在Python 3.6和aenum 2.0 (這與2.7和3.0+兼容)已被添加了新的方法:_missing_

在調用ValueError之前調用此方法,以使自定義代碼有機會嘗試查找值爲的枚舉成員。不幸的是,這使得它不適合你的用例 - 按名稱查找。

幸運的是,aenum具有限定_missing_name_方法時名稱查找失敗,將調用的額外的選項。

你上面的代碼應該是這樣的:

from aenum import Enum 

class Label(Enum): 

    RedApple = 1 
    GreenApple = 2 

    @classmethod 
    def _missing_name_(cls, name): 
     for member in cls: 
      if member.name.lower() == name.lower(): 
       return member 

而且在使用中:

>>> Label['redapple'] 
<Label.RedApple: 1> 

如果使用的是3.6 STDLIB(或想留與之兼容)卡即可(ab)使用_missing_但是:

  • 你將不得不做Label('redapple')代替(圓括號,而不是方括號中),以及
  • 你將努力對抗的枚舉設計(「redapple」是名稱,而不是價值)

披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)庫的作者。

enum34沒有這些改進,因爲它只是維護錯誤修復。

_missing_value_是優選的aenum,因爲它是更加明確它是什麼檢查,但它退到_missing_爲與STDLIB兼容性。

aenum V2.0.2有一個地方_missing_被稱爲兩個值,如果_missing_name_還沒有被覆蓋的名字錯誤 - 這是固定的V2.0.3 +。

+0

很好的答案!謝謝! – Hephaestus

+0

好的。我正在測試這個並發現_missing_沒有被調用。 – Hephaestus

+0

'ValueError:redapple不是有效的標籤' – Hephaestus