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#もこんな感じだったような気もしますが。
定数値の定義を作るときに、ぜひ活用してみてください!