web-dev-qa-db-ja.com

try / catchを使用せずにPython Enumにint値が存在するかどうかをテストするにはどうすればよいですか?

Python Enumクラスを使用して、try/catchを使用せずにEnumに特定のint値が含まれているかどうかをテストする方法はありますか?

次のクラス:

from enum import Enum

class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6

値6(trueを返す)または値7(falseを返す)をテストするにはどうすればよいですか?

39
Nathan Kovner

値をテストする

バリアント1

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

バリアント2

この機能に依存したくない場合は、これが代替手段です。

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
66

Enum.__members__を使用できます- 名前をメンバーにマッピングする順序付けられた辞書

In [12]: 'Apple' in Fruit.__members__
Out[12]: True

In [13]: 'Grape' in Fruit.__members__
Out[13]: False
13
Reda Maachi

Reda Maachiが始めたことに基づいて:

6 in Fruit.__members__.values() 

trueを返します

7 in Fruit.__members__.values()  

falseを返します

4
manu3d

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
4
JianWei