Python Enum クラスを使用して、Enum が特定の int 値を含んでいるかどうかを try/catch を使用せずにテストする方法はありますか?
次のようなクラスで。
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
値6(trueを返す)、または値7(falseを返す)をテストするにはどうしたらよいでしょうか?
Enumは
_value2membermap` という名前のメンバーを持っていることに注意してください (これはドキュメント化されておらず、将来の Python バージョンで変更/削除される可能性があります)。
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
Enum.Member.Map "の中にあるかどうかだけ確認してください。_value2membermap` にあるかどうかだけです。
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