Edited at

enumって何だよ


はじめに

どうもこんにちは

python3のドットインストール講座を2周くらいして、

人のコードを読んでも雰囲気つかめるようになってきたので、

幅広げるべく色々調べて、理解したことを備忘録としてアウトプットできたらと思います。

全く変なこと言ってたらご指摘ください。

今日はenumについて色々調べていました。


enumの概要


  • 通称、列挙型というらしい。

  • 複数の定数を1つにまとめておけるらしい。

  • enumで定義する定数を通称、列挙子というらしい。

列挙って、ならべるってことだよね。

普通定数って定義するとなると、1つ1つ定数の箱を作ってあげる必要あるけど、

このenumをつかうと、1つの定義した箱の中で、定数をまとめておけるってことね。


どんなことできるの?

とりあえず書いてみよ〜ってことで、リファレンスなどを参考に書いてみた。

#①インポート

from enum import Enum

#②クラスの引数に Enum を引数で入れるのがお作法らしい。
class Youbi(Enum):
#③この中で、定数の定義行った。曜日と対応番号をならべた。
MON = 1
TUE = 2
WED = 3
THU = 4
FRI = 5
SAT = 6
SUN = 7

print(Youbi.MON) #Youbi.MON が返ってくる。
print(Youbi.MON.name) #MON が返ってくる。
print(Youbi.MON.value) #1 が返ってくる。
print(Youbi(1).name) #MON が返ってくる。

#月曜日から3日後の曜日が知りたい場合
nanyou = Youbi.MON.value + 3 #月曜日の数値に 3日分足している。

#Youbi(nanyou)のnameを返してメッセージに出力してあげる。
print("MONから3日後は"+Youbi(nanyou).name+"です。") #MONから3日後はTHUです。が返ってくる。


結局enum使うと何がよくなるの?

色々調べてみたが、結局はコードの可読性(読みやすさ)を向上させる点にしかメリットを感じなかった。

網羅して触ってるわけじゃないので、きっと勉強すればするほど奥深い使い方ができる気ような気がする。

初心者はこのレベルのことを知ってればまぁ十分なのではないかと思った。

(初心者が言う言葉じゃないと思うけど。。。)


補習(※2018/03/15追記)

enumの良い点について、コメントいただいたので補習ということでコード書いて勉強してみました。

まず、7of9さんから頂いた内容から


動作の処理はそのままで、Enum定義の順番変更により処理の順番を変更できますね。


いろいろ調べてみたら、定期義順のイテレーション(繰り返しの処理)をサポートしてるみたいですね。

実際に書いてみました。


from enum import Enum

class Youbi(Enum):
MON = 1
TUE = 2
WED = 3
THU = 4
FRI = 5
SAT = 6
SUN = 7

for youbi in Youbi:
print("name:" + youbi.name + " , value:" + str(youbi.value))


run

name:MON , value:1

name:TUE , value:2
name:WED , value:3
name:THU , value:4
name:FRI , value:5
name:SAT , value:6
name:SUN , value:7

これはかなり便利ですね。

nameやvalueをつけて実行しても、ちゃんと内容が順番通りで返ってきます。


Python 3.6からはauto()を使えるようです。

これを使えば、列挙子の順番変更時に手作業で番号付けを変える必要がなくなりそうです。


とのことでしたので、pythonのversionをあげて検証してみました。

# autoもimportする。

from enum import Enum, auto

# それぞれの値にauto()を与えてあげる。
class Youbi(Enum):
MON = auto()
TUE = auto()
WED = auto()
THU = auto()
FRI = auto()
SAT = auto()
SUN = auto()

for youbi in Youbi:
print("name:" + youbi.name + " , value:" + str(youbi.value))


run

name:MON , value:1

name:TUE , value:2
name:WED , value:3
name:THU , value:4
name:FRI , value:5
name:SAT , value:6
name:SUN , value:7

これはすごい。定義した順番で自動採番してくれてますね。

曜日を使っている機能があちこちであって、

「月曜始まりを日曜始まりにしたい!」って要望がでたりしたら、

ここで定義した定数の順番を変えるだけで各所変更が反映できるって感じですかね!

とても勉強になりました。ありがとうございました。

続いてmather314さんから頂いたコメント


個人的には「問題領域の制限」そのものをコードに落とせる便利な記法の一つだと思っています。


コメントに書いてくださっているURLのページ拝見させていただきました。

比較などを行うにあたって、enumで必要最低限の比較対象を列挙してあげることで、

関数の処理における内容をよりスマートにさせるということですね。

これはちょっとコーディングして確認するすべが思いつきませんでしたが、

イメージつかめました。プログラミングは奥が深いです。ありがとうございました。