2017-04-04 141 views
4

我試圖讓賦予其多個值的一個枚舉的名稱:獲取枚舉名蟒蛇

class DType(Enum): 
    float32 = ["f", 8] 
    double64 = ["d", 9] 

當我試圖得到一個價值給它的工作原理名稱:

print DType["float32"].value[1] # prints 8 
print DType["float32"].value[0] # prints f 

,但是當我試圖讓出了名的給定值的唯一錯誤會:

print DataType(8).name 
print DataType("f").name 

raise ValueError("%s is not a valid %s" % (value, cls.name))

ValueError: 8 is not a valid DataType

ValueError: f is not a valid DataType

有沒有辦法做到這一點?還是我使用錯誤的數據結構?

+0

枚舉不能具有每個名稱的多個值。你爲什麼需要這個,是其中一個別名?什麼時候使用''f''和什麼時候使用'9'? –

回答

3

最簡單的方法是使用aenum庫,這應該是這樣的:

from aenum import MultiValueEnum 

class DType(MultiValueEnum): 
    float32 = "f", 8 
    double64 = "d", 9 

,並在使用中:

>>> DType("f") 
<DType.float32: 'f'> 

>>> DType(9) 
<DType.double64: 'd'> 

正如你可以看到,第一個值上市是規範值,並顯示在repr()

如果你想要所有可能的值來展現出來,或者需要使用STDLIB Enum(Python的3.4+),那麼answer found here是你想要的東西的基礎上(同時也將與aenum工作):

class DType(Enum): 
    float32 = "f", 8 
    double64 = "d", 9 

    def __new__(cls, *values): 
     obj = object.__new__(cls) 
     # first value is canonical value 
     obj._value_ = values[0] 
     for other_value in values[1:]: 
      cls._value2member_map_[other_value] = obj 
     obj._all_values = values 
     return obj 

    def __repr__(self): 
     return '<%s.%s: %s>' % (
       self.__class__.__name__, 
       self._name_, 
       ', '.join([repr(v) for v in self._all_values]), 
       ) 

,並在使用中:

>>> DType("f") 
<DType.float32: 'f', 8> 

>>> Dtype(9) 
<DType.float32: 'f', 9> 

披露:我是的作者,enum34 backportAdvanced Enumeration (aenum)庫。

+0

正是我所期待的。非常感謝你 – Ruvalcaba

+0

@Ruvalcaba:很高興幫助。當一個答案適合你,你應該接受它(點擊綠色的複選標記,該答案的分數)。從進口aenum MultiValueEnum 類D型(MultiValueEnum) : –

+0

只要改變進口 FLOAT32 = 「F」,8 double64 = 「d」,9 – epinal