2017-04-04 20 views
4

私はその複数の値のいずれかを指定した列挙型の名前を取得しようとしている:複数の値から列挙型の名前を取得しますのpython

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

名前ごとに複数の値を設定することはできません。なぜあなたはこれを必要としますか、これらのエイリアスの1つですか?いつ '' 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(パイソンを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 backportおよびAdvanced Enumeration (aenum)ライブラリーが含まれる。

+0

私が探していたもの。ありがとうございました – Ruvalcaba

+0

@ルヴァルカバ:喜んで助けてください。答があなたのために働くとき、あなたはそれを受け入れるべきです(その答えのスコアによって緑色のチェックマークをクリックしてください)。 aenum輸入MultiValueEnum クラスDTYPE(MultiValueEnum)から : –

+0

ちょうどへのインポートを変更 のfloat32 = "F"、8 double64 = "D"、9 – epinal

関連する問題