Python enum.verify: ให้คลาส Enum ล้มตั้งแต่ import เมื่อค่าผิดสัญญา
พี่โชว์Engineering
Enum ที่มีค่าซ้ำหรือเลขกระโดดอาจผ่าน review แล้วไปพังตอน serialize ครับ enum.verify เป็น class decorator ที่ตรวจ invariant ตอนสร้างคลาส จึงหยุดเร็วตั้งแต่ import แทนรอให้ข้อมูลผิดเดินถึง production
from enum import CONTINUOUS, UNIQUE, Enum, verify
import unittest
@verify(UNIQUE, CONTINUOUS)
class Stage(Enum):
QUEUED = 1
RUNNING = 2
DONE = 3
class EnumVerifyTests(unittest.TestCase):
def test_valid_contract(self):
self.assertEqual([stage.value for stage in Stage], [1, 2, 3])
def test_duplicate_is_rejected(self):
with self.assertRaises(ValueError):
@verify(UNIQUE)
class Broken(Enum):
FIRST = 1
SECOND = 1
if __name__ == "__main__":
unittest.main()
UNIQUE ไม่เหมาะเมื่อ alias เป็นส่วนตั้งใจของ compatibility และ CONTINUOUS ไม่เหมาะกับ protocol ที่สงวนหมายเลขบางช่วง เลือก verifier ตามสัญญาจริง ไม่ใช่เปิดทุกตัวเพราะดูเข้ม ส่วน flag enum มี NAMED_FLAGS สำหรับตรวจ mask ที่ประกาศ
Recap
- ใช้
UNIQUEเมื่อ alias คือ bug - ใช้
CONTINUOUSเมื่อเลขต้องไม่เว้นช่วง - อย่าบังคับกฎที่ขัดกับ wire protocol
- เพิ่ม test import/definition ของ enum สำคัญ