enumは何
列挙型とは、コンピュータプログラミングにおいて、...実際のコンパイル時あるいは実行時には、列挙型は整数で実装されることが多い -- ウィキペディア
個人的な見解としては、ラベルみたいなものです
pythonで実施してみます
enum_1.py
# モジュールをインポート
from enum import Enum
# クラスのパラメータにEnumを与えればok
class LANGUAGE(Enum):
PYTHON = 1
JAVA = 2
PHP = 3
GO = 4
print(LANGUAGE.PYTHON) # LANGUAGE.PYTHON
print(LANGUAGE.PYTHON.name) # PYTHON
print(LANGUAGE.PYTHON.value) # 1
# ループさせることもできる
for x in LANGUAGE:
print(x)
# LANGUAGE.PYTHON
# LANGUAGE.JAVA
# LANGUAGE.PHP
# LANGUAGE.GO
# enumのvalueも別に数字である必要はありません
class LANGUAGE(Enum):
PYTHON = 'python'
print(LANGUAGE.PYTHON.value)
# python
# 数字でvalueを固定したい場合
# IntEnumモジュールをインポート
from enum import IntEnum
class LANGUAGE(IntEnum):
PYTHON = 'python'
JAVA = 2
PHP = 3
GO = 4
# 下記のエラーが出ます
ValueError: invalid literal for int() with base 10: 'python'
# 同じ値が存在することもできる
class LANGUAGE(Enum):
PYTHON = 2
JAVA = 2
PHP = 3
GO = 4
# ただし、この場合、ニ個目の定義は基本無視される(表示させる方法もあるけど)
for x in LANGUAGE:
print(x)
# 同じ値を定義させない方法もある
# uniqueモジュールをインポート
from enum import unique
@unique
class LANGUAGE(Enum):
PYTHON = 2
JAVA = 2
PHP = 3
GO = 4
# 下記のエラーが出ます
ValueError: duplicate values found in <enum 'LANGUAGE'>: JAVA -> PYTHON
実用例を見てみます
enumの実用例としてはデータベースの連携にあると私は考えています。
例えば、よくあるユーザーテーブルを例として見てみます...
User
name | age | status |
---|---|---|
python | 29(意外と長い) | 1 |
go | 10 | -1 |
statusカラムに注目しましょう 、1と-1の値がそれぞれ入ってます、意味としては
- 1が正常にログイン出来る
- -1はブロックされてログイン出来ない
でも数字だけ見ても意味が分からないし、更に2、3、4、5と増えて行くので推測すら難しい
ここでenumの登場です
enum_2.py
# モジュールをインポート
from enum import Enum
# 例えばaはuser表のstatusカラムの値
a = 1
class STATUS(Enum):
NORMAL = 1
BLOCK = -1
print(STATUS(a).name) # NORMALが出力される、わかりやすいでしょう
Explicit is better than implicit(暗示するより明示するほうがいい。).
--pythonの哲学