从多个值python中获取Enum名称

时间:2017-04-04 09:07:14

标签: python enums multiple-value

我正在尝试使用其多个值之一来获取枚举的名称:

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
  

引发ValueError(“%s不是有效的%s”%(值,cls。名称))

     

ValueError:8不是有效的DataType

     

ValueError:f不是有效的DataType

有没有办法做到这一点?或者我使用了错误的数据结构?

1 个答案:

答案 0 :(得分:11)

最简单的方法是使用aenum 1 ,如下所示:

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>

1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者。