Python IntEnumの基本的な使い方

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

次の目標を300日に設定した181日目から119日が経過して、ようやく300日の目標を達成しました!

私の記憶が確かなら、こんなに長い間、一つのことを継続できたのは【寝ることとご飯を食べること】くらいしか思いつきません。

ほんと、自分で自分を褒めてあげたいです。

とはいえ、当初の目標である365日には、あと65日残っているので、気持ちを引き締めて継続していこうと思います。

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

昨日の復習

昨日は、Enumを使ってサーバーの状態に応じた処理をする方法を学習しました。

Enumで設定し列挙型定数の使いどころとしては、サーバーの状態を取得してデータベースに保存した値を活用して、サーバーを操作するなどの使い方がありました。

データーベースに状態を取得する操作やシャットダウンの操作は、擬似的なコードで代用しましたが、実際の使用には代用した部分に具体的なコードが必要でした。

Enumを使った基本的なサーバーの操作については、昨日の記事をごらんください。

今日は、Enumより便利な使い方のできるintEnumを学習します。

IntEnum

Enumを使ったサーバーの操作では、列挙型定数の整数部分を取得するために、任意のクラスオブジェクトSatus()の引数にデータベースのvalueを得るコードを入れる必要がありましたが、IntEnumを使うことですっきりしたコードにすることができます。

import enum

db = {'server1': 1,'server2': 2}

class Status(enum.IntEnum):
    ACTIVE = 1
    INACTIVE = 2
    RUNNING = 3

if db['server1'] == Status.ACTIVE:
    print('shutdown')
elif db['server1'] == Status.INACTIVE:
    print('terminate')

昨日のコードと比べると、10行目のdb['server1']が、昨日はStatus(db['server1'])になっていました。

出力結果は昨日と同じくserver1の値が1なので、shutdownが出力されます。

出力結果

shutdown

2つを比較

ちょっとした違いですが、同じ結果が得られるEnumIntEnumですが、その違いは整数を保持しているかどうかです。

コードを必要なものだけにして、EnumIntEnumの値やタイプを出力してみます。

import enum

db = {'server1': 1}

class Status(enum.Enum):
    ACTIVE = 1

class Status_Int(enum.IntEnum):
    ACTIVE = 1

print(Status.ACTIVE)
print(Status_Int.ACTIVE)
print(type(Status.ACTIVE))
print(type(Status_Int.ACTIVE))
print(Status.ACTIVE == 1)
print(Status_Int.ACTIVE == 1)

出力結果

Status.ACTIVE
Status_Int.ACTIVE
<enum 'Status'>
<enum 'Status_Int'>
False
True

11行目と12行目の出力は、それぞれの列挙型定数を出力していて、13行目と14行目はEnumのクラスオブジェクト名を持ったタイプを出力しています。

15行目と16行目は、取得する整数の値との比較をしているので、15行目はFalseになり、16行目はTrueという出力結果になっています。

出力するオブジェクト名もタイプも同じだけど、IntEnumは整数の値(value)を取得しているのでTrueが返され、Enumは整数の値(value)を取得するのではなくnameを取得しているのでFalseが返されています。

まとめ

EnumIntEnumの違いは、nameを返すか整数のvalueを返すかの違いですが、IntEnumは整数を返すので、コードがシンプルになってわかりやすくなります。

最近、Googleは、ホームページで使用している画層の解像度も評価の一つにしているようなので、画像サイズはそれなりに大きくなりますが、より軽いサイズにして表示速度を早くする必要もあります。

同じように、記述するコードをよりシンプルにすると同時に、文字列よりサイズを抑えられる整数を使って少しでも処理速度を上げることが利用者の利便性に繋がります。

ほんの数秒の違いが利用者の増減に関わってくるので、コードもIntEnumなどを活用して少しでもサイズを小さくするように心がけましょう。

それでは、明日もGood Python!