1. ホーム
  2. python

[解決済み] Python Enum に int 値が存在するかどうかを try/catch を使用せずにテストするには?

2022-08-14 14:49:45

質問

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

以下のクラスで。

from enum import Enum

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

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

どのように解決するのですか?

値のテスト

バリアント1

Enum というメンバーを持っています。 _value2member_map_ というメンバがあります (これは文書化されておらず、将来の 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

バリアント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