2017-03-16 13 views
3

Python 3 programmaticallyで導入されたEnumクラスを使用する場合、プログラマは与えられた整数のEnumメンバーシップをどのようにチェックするべきですか?Python Enumクラスメンバシップ

明らかに、あなたはちょうどask for forgivenessであることができますが、他には見逃している会員確認機能がありますか?より明示的に言えば、整数値をとり、その値が有効な列挙に対応するかどうかを確認したいと思います。

from enum import Enum 

class TestEnum(Enum): 
    a = 0 
    b = 1 
    c = 2 

出力:

In [13]: TestEnum(0) 
Out[13]: <TestEnum.a: 0> 

In [14]: TestEnum(4) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-14-09c663e9e214> in <module>() 
----> 1 TestEnum(4) 

C:\Anaconda3\lib\enum.py in __call__(cls, value, names, module, qualname, type, start) 
    239   """ 
    240   if names is None: # simple value lookup 
--> 241    return cls.__new__(cls, value) 
    242   # otherwise, functional API: we're creating a new Enum type 
    243   return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start) 

C:\Anaconda3\lib\enum.py in __new__(cls, value) 
    474     if member._value_ == value: 
    475      return member 
--> 476   raise ValueError("%r is not a valid %s" % (value, cls.__name__)) 
    477 
    478  def __repr__(self): 

ValueError: 4 is not a valid TestEnum 
+1

私の知る限りでは、 'TestEnum'が' enum.IntEnum'から派生している限り、TestEnum .__ members __。values() 'で' 4を試すことができます。 – farsil

+0

@farsil、答えとしてあなたのコメントを入れてください –

答えて

3

列挙型は__contains__メソッドを持っていないが、それはメンバー名ではなく、メンバーの値をチェック:(CPythonの中に)内部

def __contains__(cls, member): 
    return isinstance(member, cls) and member._name_ in cls._member_map_ 

彼らは名前に値をマップするプライベート属性(意志を持っています)しかしハッシュ可能な値のために働くのみ:

>>> 2 in TestEnum._value2member_map_ 
True 
>>> 3 in TestEnum._value2member_map_ 
False 

しかし、それは、したがって、あなたが__members__.values()をループし、独自のメソッドを追加することができ、彼らはいつでも変更することができるようプライベート属性に頼ることはお勧めできません。

>>> class TestEnum(Enum): 
...  a = 0 
...  b = 1 
...  c = 2 
... 
...  @classmethod 
...  def check_value_exists(cls, value): 
...   return value in (val.value for val in cls.__members__.values()) 
... 

>>> 
>>> TestEnum.check_value_exists(2) 
True 
>>> TestEnum.check_value_exists(3) 
False 
0

はあなたが意味するか:

from enum import Enum 

class TestEnum(Enum): 
    a = 3 
    b = 2 
    c = 1 


print(TestEnum.b.name,TestEnum.b.value) 

それとも

print(TestEnum(2).name,TestEnum(2).value) 

出力:

B 2