lisz-works

技術と興味の集合体

Python定数定義ならIntEnumとauto()が便利!

【スポンサーリンク】

Python

Python3で数値の列挙型(enum)を作るときどうしてますか?

IntEnumとauto()を使うと、かなり楽できますよ!

列挙型(enum)とは?

ある値を列挙した値を定義するものです。

例えば、何かのIDを定義するとき、1ずつ作ると面倒だし、纏めるために名前が長くなったりしますよね……

ACTION_ID_STOP = 0
ACTION_ID_MOVE = 1
ACTION_ID_JUMP = 2

しかし列挙型を使えば、コレをクラスにまとめることができます。

class ActionID(IntEnum):
    STOP = 0
    MOVE = 1
    JUMP = 2

ズラズラ書くよりスッキリしますね!

IneEnumってなに?

「Enum」というものと「IntEnum」というものがあります。

「Enum」は、Enum型という型で、設定した値も、「Enum型の値」として取り扱われます。

>>> class EnumNum(Enum):
...   VALUE = 1
...
>>> EnumNum.VALUE
<EnumNum.VALUE: 1>
>>> EnumNum.VALUE == 1
False

しかし「IntEnum」は、設定値をint型として取り扱うことができます。

>>> class IntEnumNum(IntEnum):
...   VALUE = 1
...
>>> IntEnumNum.VALUE
<IntEnumNum.VALUE: 1>
>>> IntEnumNum.VALUE == 1
True

厳格に「このステータスでないと」と判定させたいならEnumがよいかもしれません。
ただ取り回しの良さを考えると、通常時はIntEnumを使ったほうが、楽だし良いと思います!

値を自動設定するauto()

「何かのIDを定義する」というとき、値がなんでもいい場合がありますよね?
最初の例に使っていた

class ActionID(IntEnum):
    STOP = 0
    MOVE = 1
    JUMP = 2

ですが、別に各値には意味がありません。

そんなとき、auto()を使うと便利です。

class ActionID(IntEnum):
    STOP = auto()
    MOVE = auto()
    JUMP = auto()

とすることで、適当な値を自動で振ってくれます!

いちいち各値の定義値を考える必要がなくなりますね!

import

まずはコレをimportしましょう!

「auto()は使わないなー」という場合は、「, auto」部分は不要です。

from enum import IntEnum, auto

書き方

紹介で書き方を書いてしまっているようなもんですが……(笑)

自前で値を入れる場合はこんな感じに。

class ActionID(IntEnum):
    STOP = 0
    MOVE = 1
    JUMP = 2

auto()で割り振ってもらう場合は、こんな感じに書きます。

class ActionID(IntEnum):
    STOP = auto()
    MOVE = auto()
    JUMP = auto()

値を全て配列に入れる

「配列に入れて回したいなー」

とか思ったらこのようにすると、定義した列挙型を全て配列にセットすることができました。

>>> idList = []
>>> for id in ActionID:
...     idList.append(id)
...
>>> idList
[<ActionID.STOP: 1>, <ActionID.MOVE: 2>, <ActionID.JUMP: 3>]

ちゃんと入っていますね。

>>> val = [1, 2, 3]
>>> for i in range(0, 3):
...     print(str(idList[i] == val[i]))
...
True
True
True

あとがき

ということで、列挙型(Enum)に定義、IntEnum型とauto()についてでした!

C言語などではよく使っていた列挙型ですが、やっぱあると便利ですね。

またクラスという形でまとめられるので、「このグループの、この値」と表現できるのが良いですね。
C++だかC#もこんな感じだったような気もしますが。

定数値の定義を作るときに、ぜひ活用してみてください!