PythonのEnumの使い方を理解する

Pythonのenumの使い方を解説します。

PythonのEnumの使い方を理解する

列挙型(enum)とは?

列挙型(enum型)とは、プログラミングにおいて、事前に定義された一定の値の集合を表すデータ型のことです。

具体的には、定数を表すために使用されます。たとえば、色や方向、曜日、季節など、コード内で使用する数や種類が限られているものを列挙型で表現することができます。列挙型は、コードの可読性を向上させ、値の入力ミスを防止することができます。

なぜenum型が必要なのか?メリットは?

列挙型を使用することによって、以下のようなメリットがあります。

  • 可読性の向上
  • 入力ミスの防止
  • コードの簡潔化

可読性の向上

列挙型を使用すると、プログラムの可読性が向上します。定数の値を単純な数値などで表すのではなく、わかりやすい名前(変数)で表すことができるためです。また、それぞれの定数をグループ化できることによって、定数の意味がわかりやすくなり、コードが読みやすくなります。

入力ミスの防止

列挙型は定数の値の集合を定義するため、選択肢以外の許可されていない値が入力されることを防ぐことができます。

コードの簡潔化

列挙型を使用することで、コードが簡潔になります。これは変数や定数を設定するメリットでもありますが、特定の値を繰り返し記述する必要がなくなるため、コードの重複を避けることができます。

どのような場面で使うのか?

列挙型は、主に『定数が特定の選択肢の値のみを取ることを保証したい場合』に利用します。

たとえば、月、曜日、性別、年代など、限られた選択肢を列挙してまとめて扱いたい場合に便利です。

以下で、具体例を用いて基本的な使い方を解説します。

PythonのEnumの基本的な使い方

Pythonの列挙型は、標準モジュールenumのEnumクラスを継承して定義します。Enumは名前(name)と値(value)を持ち、それぞれEnumを継承したクラスの中で定義します。

以下の例では、Colorという列挙型を定義しています。Colorには、3つの定数であるREDGREENBLUEが含まれています。定数は、それぞれ123の値を持っています。

# Enumの基本的な使い方

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(Color.RED)
# Color.RED

print(type(Color.RED))
# <enum 'Color'>

print(Color.RED.name)
# RED

print(type(Color.RED.name))
# <class 'str'>

print(Color.RED.value)
# 1

print(type(Color.RED.value))
# <class 'int'>

列挙型に対しては、Color.RED.nameのようにnameにアクセスしたり、Color.RED.valueのようにvalueにアクセスすることができます。

また、列挙型は他のデータ型と同様に、クラスのメンバーとして定義することができます。以下は、Animalという列挙型の例です。

from enum import Enum

class Animal(Enum):
    CAT = "にゃー"
    DOG = "わん"
    HORSE = "ひひん"

class Pet:
    def __init__(self, name: str, animal_type: Animal):
        self.name = name
        self.animal_type = animal_type
    
    def speak(self):
        print(f"{self.animal_type.value}! 私の名前は{self.name}です。")

pet1 = Pet("たま", Animal.CAT)
pet1.speak()
# にゃー! 私の名前はたまです

pet2 = Pet("ぽち", Animal.DOG)
pet2.speak()
# わん! 私の名前はぽちです

この例では、Animalという列挙型を定義しています。各定数には、その動物が発する音を表す値を割り当てています。Petクラスでは、ペットの名前と動物の種類を持つインスタンスを作成し、speak()メソッドでそのペットが発する音を出力しています。

列挙型を使用することで、動物の種類をシンボルで表現できるため、コードがより可読性が高くなる上に、間違った音を出力することがなくなります。将来的に鳴き声を追加・変更する場合にも列挙型の値を変更するだけで済みます。

Pythonであっても、型を定義しておくことで、変な値が入ることを防ぐこともできるようになります。