複数の値のいずれかを指定して列挙型の名前を取得しようとしています。
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ではありません
これを作る方法はありますか?または、間違ったデータ構造を使用していますか?
最も簡単な方法は、 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
) ライブラリ。