2017-04-04 117 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