web-dev-qa-db-ja.com

複数の値から列挙型名を取得python

複数の値のいずれかを指定して列挙型の名前を取得しようとしています。

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

名前を付けて1つの値を取得しようとすると、次のようになります。

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

しかし、指定された値から名前を取得しようとすると、エラーのみが発生します。

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

値を上げるError( "%sは有効な%sではありません"%(value、cls .name))

ValueError:8は有効なDataTypeではありません

ValueError:fは有効なDataTypeではありません

これを作る方法はありますか?または、間違ったデータ構造を使用していますか?

11
Ruvalcaba

最も簡単な方法は、 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+)を使用する必要がある場合は、 ここにある回答 が必要なものの基礎になります(および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 Enum_enum34_ backport 、および Advanced Enumeration(aenum ライブラリ。

14
Ethan Furman