Pythonでの列挙型(enum)の使い方とは?識別子の集合について紹介!
 
          
- システム
 エンジニア
- enumの特徴と使い方について教えてください。
- プロジェクト
 マネージャー
- 列挙型とも呼ばれ、決められた複数の選択肢から値を指定する際に利用します。
Pythonでの列挙型(enum)の使い方とは?

            今回は、Pythonでの列挙型(enum)の使い方について説明します。
            enumとは、識別子の集合です。通常、意味のある集合体として定義します。
ここでは、Enumクラス、IntEnumクラス、Flagクラス、unique、auto関数
            について紹介します。
            Pythonでのenumの使い方に興味のある方はぜひご覧ください。
            
Enumクラス
Pythonにおけるenumの基底クラスであるEnumクラスの使い方を紹介します。
実際のソースコードを見てみましょう。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         
                          7
                         
                          8
                         
                          9
                         | 
                          from enum import Enum
                         
                          class Fruits(Enum):
                         
                              APPLE= 1
                         
                              BANANA = 2
                         
                              CHERRY = 3
                         
                          print(Fruits.APPLE) # Fruits.APPLE
                         
                          print(repr(Fruits.BANANA)) # <Fruits.BANANA: 2>
                         
                          print(type(Fruits.CHERRY)) # <enum 'Fruits'>
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         | 
                          Fruits.APPLE
                         
                          <Fruits.BANANA: 2>
                         
                          <enum 'Fruits'>
                         | 
enumの比較は以下のように記述します。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         | 
                          print(isinstance(Fruits.APPLE, Fruits)) # True
                         
                          print(Fruits.BANANA == Fruits.BANANA)   # True
                         
                          print(Fruits.BANANA == Fruits.CHERRY)   # False
                         
                          print(Fruits.APPLE == 1)                # False
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         | 
                          True
                         
                          True
                         
                          False
                         
                          False
                         | 
enumの識別子や値を確認するには、以下のように記述します。
| 
                          1
                         
                          2
                         | 
                          print(Fruits.APPLE.name)   # APPLE
                         
                          print(Fruits.BANANA.value) # 2
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         | 
                          APPLE
                         
                          2
                         | 
enumはfor文で全要素を処理できます。
| 
                          1
                         
                          2
                         | 
                          for fruits in Fruits:
                         
                              print(fruits, fruits.name, fruits.value)
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         | 
                          Fruits.APPLE APPLE 1
                         
                          Fruits.BANANA BANANA 2
                         
                          Fruits.CHERRY CHERRY 3
                         | 
配列のように要素にアクセスすることもできます。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         | 
                          print(Fruits(1))             # Fruits.APPLE
                         
                          print(Fruits['BANANA'])      # Fruits.BANANA
                         
                          print(Fruits(2).value)       # 2
                         
                          print(Fruits['CHERRY'].name) # CHERRY
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         | 
                          Fruits.APPLE
                         
                          Fruits.BANANA
                         
                          2
                         
                          CHERRY
                         | 
要素が重複すると、コンパイルエラーになります。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         | 
                          from enum import Enum
                         
                          class Fruits(Enum):
                         
                              APPLE= 1
                         
                              BANANA = 2
                         
                              BANANA = 3
                         | 
コンパイル結果は以下のようになります。
| 
                          1
                         | 
                          TypeError: Attempted to reuse key: 'BANANA'
                         | 
Pythonでは、このようにenumを使用します。
IntEnumクラス
EnumクラスおよびintのサブクラスでもあるIntEnumクラスを紹介します。PythonのIntEnumクラスはint型と比較できます。
実際のソースコードを見てみましょう。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         
                          7
                         
                          8
                         
                          9
                         
                          10
                         
                          11
                         
                          12
                         
                          13
                         
                          14
                         
                          15
                         
                          16
                         
                          17
                         
                          18
                         
                          19
                         
                          20
                         
                          21
                         
                          22
                         | 
                          from enum import Enum, IntEnum
                         
                          class Fruits(Enum):
                         
                              APPLE = 1
                         
                              BANANA = 2
                         
                              CHERRY = 3
                         
                          class Color(IntEnum):
                         
                              RED = 1
                         
                              GREEN = 2
                         
                              BLUE = 3
                         
                          class OS(IntEnum):
                         
                              WINDOWS = 1
                         
                              LINUX = 2
                         
                              MAC = 3
                         
                          # Enumはintと比較できない
                         
                          print(Fruits.APPLE == 1)       # False
                         
                          # IntEnumはintと比較できる
                         
                          print(Color.RED == 1)          # True
                         
                          print(Color.RED == OS.WINDOWS) # True
                         
                          print(int(Color.GREEN))        # 2
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         | 
                          False
                         
                          True
                         
                          True
                         
                          2
                         | 
このように、PythonのIntEnumクラスはint型と比較できます。
Flagクラス
ビット演算子 (&, |, ^, ~) が使用可能なenumである、Flagクラスを紹介します。
実際のソースコードを見てみましょう。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         
                          7
                         
                          8
                         
                          9
                         
                          10
                         
                          11
                         
                          12
                         
                          13
                         
                          14
                         
                          15
                         | 
                          from enum import Flag, auto
                         
                          class Fruits(Flag):
                         
                              APPLE = auto()
                         
                              BANANA = auto()
                         
                              CHERRY = auto()
                         
                              MIX1 = APPLE | BANANA
                         
                              MIX2 = APPLE | BANANA | CHERRY
                         
                          for fruits in Fruits:
                         
                              print(fruits, fruits.name, fruits.value)
                         
                          print(Fruits.MIX1 == (Fruits.APPLE | Fruits.BANANA)) # True
                         
                          print(Fruits.APPLE in Fruits.MIX1)  # True
                         
                          print(Fruits.BANANA in Fruits.MIX1) # True
                         
                          print(Fruits.CHERRY in Fruits.MIX1) # False
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         
                          7
                         
                          8
                         
                          9
                         | 
                          Fruits.APPLE APPLE 1
                         
                          Fruits.BANANA BANANA 2
                         
                          Fruits.CHERRY CHERRY 4
                         
                          Fruits.MIX1 MIX1 3
                         
                          Fruits.MIX2 MIX2 7
                         
                          True
                         
                          True
                         
                          True
                         
                          False
                         | 
このように、PythonのFlagクラスはビット演算子が使用できます。
unique
識別子が重複しないことを保証するデコレーターである、uniqueを紹介します。
実際のソースコードを見てみましょう。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         | 
                          from enum import Enum, unique
                         
                          @unique
                         
                          class Fruits(Enum):
                         
                              APPLE= 1
                         
                              BANANA = 2
                         
                              CHERRY = 2
                         | 
以下のようなコンパイルエラーが発生します。
| 
                          1
                         | 
                          ValueError: duplicate values found in <enum 'Fruits'>: CHERRY -> BANANA
                         | 
@uniqueをコメントアウトするとコンパイルエラーにはなりません。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         
                          7
                         
                          8
                         
                          9
                         | 
                          from enum import Enum, unique
                         
                          #@unique
                         
                          class Fruits(Enum):
                         
                              APPLE= 1
                         
                              BANANA = 2
                         
                              CHERRY = 2
                         
                          for fruits in Fruits:
                         
                              print(fruits, fruits.name, fruits.value)
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         | 
                          Fruits.APPLE APPLE 1
                         
                          Fruits.BANANA BANANA 2
                         | 
このようにPythonでは、識別子を重複させたくない場合はuniqueを使用します。
auto関数
値をプログラマが指定する必要がない場合、auto関数が使用できます。
実際のソースコードを見てみましょう。
| 
                          1
                         
                          2
                         
                          3
                         
                          4
                         
                          5
                         
                          6
                         
                          7
                         
                          8
                         | 
                          from enum import Enum, auto
                         
                          class Fruits(Enum):
                         
                              APPLE = auto()
                         
                              BANANA = auto()
                         
                              CHERRY = auto()
                         
                          for fruits in Fruits:
                         
                              print(fruits, fruits.name, fruits.value)
                         | 
実行結果は以下のようになります。
| 
                          1
                         
                          2
                         
                          3
                         | 
                          Fruits.APPLE APPLE 1
                         
                          Fruits.BANANA BANANA 2
                         
                          Fruits.CHERRY CHERRY 3
                         | 
このようにPythonでは、値をプログラマが指定する必要がない場合、auto関数が使用できます。
            
- システム
 エンジニア
- 選択肢にない値を指定してしまう不具合を抑制してくれるのですね。
- プロジェクト
 マネージャー
- enum以外の値を指定すると不具合を指摘してくれます。
まとめ
いかがでしたでしょうか。Pythonでの列挙型(enum)の使い方について説明しました。
enumとは、識別子の集合です。通常、意味のある集合体として定義します。
            ここでは、Enumクラス、IntEnumクラス、Flagクラス、unique、auto関数
            について紹介しました。
ぜひご自身でソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
          
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
          数多くのエンジニアが集まります。

- 
              スマホアプリから業務系システムまで スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。 
- 
              充実した研修制度 毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。 
- 
              資格取得を応援 スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。 
- 
              東証プライム上場企業グループ オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。 安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。 
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
              まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
- 
              
              開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク月給29万~30万円東京都品川区(大崎駅)
- 
              
              遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク月給45万~60万円東京都港区(六本木駅)
- 
              
              病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク月給30万~30万円東京都豊島区(池袋駅)
- 
              
              開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク月給50万~50万円東京都豊島区(大塚駅)
- 
              
              債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務月給62万~67万円東京都文京区(後楽園駅)
- 
              
              PMO/東京都豊島区/【WEB面談可】/在宅勤務月給55万~55万円東京都豊島区(池袋駅)





