Python Enumの基本的な使い方

Python学習【365日チャレンジ!】298日目のマスターU(@Udemy11)です。

前からフィッシングカヤックのことは気になっていたのですが、実際に導入する予定がなかったので、じっくりと調べていませんでした。

ネットをうろついていたら、ふとフィッシングカヤックの広告が飛び込んできたので、ついつい広告をクリックしてしまいました。

安いもので、3万円台のものがあり、ちょびっと好奇心をくすぐられたので、フィッシングカヤックに免許が必要なのかとか、どこから出航できるのかとか、調べてみると、いろいろと装備品にもそれなりに経費が必要だし、安全面とかも考えると「やっぱり無理だな~」と思ってしまいました。

とはいえ、魚群探知機を装着して、魚が確実にいるところで釣りができるってのは魅力なので、お金にも時間にも余裕が出てきたら再度考えてみようと思います。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、ビット演算の論理和・論理積・排他的論理和・反転・シフトについて学習しました。

ビット演算子は、ほぼ実践で使うことはないようですが、プログラムを学習するのなら、一度は習っておいたほうがいいだろうということで、さらっとコードを眺めてみました。

|&^などの演算子を使った2進数の演算なので、ちょっとややこしいのですが、そのルールだけ理解しておけばいいんじゃないかと思います。

ビット演算の詳細については、昨日の記事をごらんください。

今日は、定義した値以外の操作をするときはエラーをかえすEnumの基本を学習します。

enumとは

enumは、列挙型と呼ばれていて、クラスで定義した変数を選択肢にして値を取得する際に使われるモジュールです。

Enumクラスを継承する形で列挙型定数を作成し、サブクラスを定義します。

from enum import Enum

class Status(Enum):
    ACTIVE = 1
    INACTIVE = 2
    RUNNING = 3

print(Status.ACTIVE)
print(repr(Status.ACTIVE))
print(Status.ACTIVE.name)
print(Status.ACTIVE.value)

最初にenumモジュールからEnumをインポートします。

3行目でEnumを継承したStatusクラスを定義していますが、ACTIVE = 1INACTIVE = 2RUNNING = 3の3つの列挙型定数を定義しています。

8行目から11行目で列挙型定数ACTIVEをそのまま、reprnamevalueを出力しています

出力結果

Status.ACTIVE
<Status.ACTIVE: 1>
ACTIVE
1

そのまま出力すると、人が読めるデータを表示して、reprはPythonオブジェクト、nameは名前、valueは数値がそれぞれ出力されています。

Statusはクラスですが、イテラブルオブジェクトでもあるので、forループを使って、列挙型定数を取り出すことが可能です。

for s in Status:
    print(s)

出力結果

Status.ACTIVE
Status.INACTIVE
Status.RUNNING

列挙型定数の名前が同じで数値が違う場合はエラーを起こしますが、名前が違って数値が同じ場合は先に記述されたデータが優先されます。

from enum import Enum

class Status(Enum):
    ACTIVE = 1
    ACTIVE = 2 #列挙型定数の名前が同じなので、エラーが起こる

print(Status.ACTIVE)
from enum import Enum

class Status(Enum):
    ACTIVE = 1
    RENAME_ACTIVE = 1 #数値が同じだが、ACTIVEが優先されてエラーは起こらない

print(Status.ACTIVE) #出力結果はStatus.ACTIVE
print(Status.RENAME_ACTIVE) #こちらも出力結果はStatus.ACTIVE

まとめ

Enumの基本的な使い方を学習しましたが、列挙型定数以外の値が入力された場合にエラーが起こるわけですが、条件分岐のif文を使わずに表現することができるのも特徴の一つです。

具体的な使い方は酒井さんの講座で紹介されているようなサーバーの状態を判断するような使い方になるのだろうと思います。

Pythonを学習してきて、300日の継続が目の前ですが、いつも同じような使い方ができるものが多いので、一体どれを使えばいいんだろうと疑問に思ってしまいます。

この疑問に対する回答は、実践することでしか得られないのかもしれませんね。

ということで、明日もGood Python!