enum module (Python 3.4+) ให้การสร้าง Enumeration - ชุดค่าคงที่ที่มีชื่อและค่าเฉพาะ ใช้แทน magic numbers/strings
สร้าง Enum พื้นฐาน
from enum import Enum
class Language(Enum):
PYTHON = 1
JAVA = 2
CPP = 3
RUBY = 4
การเข้าถึง Members
>> Language.PYTHON
>>> print(Language.PYTHON)
Language.PYTHON
>>> repr(Language.PYTHON)
''
>>> Language.PYTHON.name # 'PYTHON'
>>> Language.PYTHON.value # 1
Iteration
>> for lang in Language:
... print(lang.name, lang.value)
PYTHON 1
JAVA 2
CPP 3
RUBY 4
Lookup by Value / Name
>> Language(3)
>>> Language['JAVA']
Comparison
>> x = Language(2)
>>> y = Language(4)
>>> x is y
False
>>> x == Language.JAVA
True
>>> x == 2 # False! Enum ไม่เท่ากับ int โดยตรง
False
Duplicate Values (Aliases)
class Language(Enum):
PYTHON = 1
JAVA = 2
CPP = 3
RUBY = 4
CPLUSPLUS = 3 # alias ของ CPP
>>> Language.CPP
>>> Language.CPLUSPLUS
# ชี้ไป member แรกที่มีค่า 3
>>> Language(3)
@unique - ห้ามซ้ำค่า
from enum import Enum, unique
@unique
class Language(Enum):
PYTHON = 1
JAVA = 2
CPP = 3
RUBY = 4
CPLUSPLUS = 3 # ValueError: duplicate values found
IntEnum - เป็น subclass ของ int
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
>>> Priority.HIGH > Priority.LOW
True
>>> Priority.HIGH + 10
13
>>> [Priority.LOW, Priority.HIGH] # สามารถ sort ได้
[, ]
Auto Values
from enum import Enum, auto
class Color(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
>>> list(Color)
[, , ]
เมื่อไหร่ควรใช้ Enum?
- State machines, status codes
- Configuration options
- API constants
- ทุกที่ที่มีค่าคงที่จำกัดกลุ่ม