Python Enumクラスを使用して、try/catchを使用せずにEnumに特定のint値が含まれているかどうかをテストする方法はありますか?
次のクラス:
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
値6(trueを返す)または値7(falseを返す)をテストするにはどうすればよいですか?
Enum
には_value2member_map_
(文書化されていない...)というメンバーがあります。
print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
このマップに対してEnum
に値があるかどうかをテストできます。
5 in Fruit._value2member_map_ # True
7 in Fruit._value2member_map_ # False
この機能に依存したくない場合は、これが代替手段です。
values = [item.value for item in Fruit] # [4, 5, 6]
または(おそらくより良い):set
;を使用します。 in
演算子はより効率的です:
values = set(item.value for item in Fruit) # {4, 5, 6}
その後でテスト
5 in values # True
7 in values # False
has_value
をクラスに追加します次に、これをメソッドとしてクラスに追加できます。
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
@classmethod
def has_value(cls, value):
return value in cls._value2member_map_
print(Fruit.has_value(5)) # True
print(Fruit.has_value(7)) # False
名前ではなく(値ではなく)テストする場合は、_member_names_
を使用します。
'Apple' in Fruit._member_names_ # True
'Mango' in Fruit._member_names_ # False
Enum.__members__
を使用できます- 名前をメンバーにマッピングする順序付けられた辞書 :
In [12]: 'Apple' in Fruit.__members__
Out[12]: True
In [13]: 'Grape' in Fruit.__members__
Out[13]: False
Reda Maachiが始めたことに基づいて:
6 in Fruit.__members__.values()
trueを返します
7 in Fruit.__members__.values()
falseを返します
Enum. _value2member_map_
にあるかどうかを確認してください
In[15]: Fruit._value2member_map_
Out[15]: {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
In[16]: 6 in Fruit._value2member_map_
Out[16]: True
In[17]: 7 in Fruit._value2member_map_
Out[17]: False