งูสีเขียวต้นฉบับกำลังตรวจบัตรสถานะที่เรียงต่อกันและแยกบัตรค่าซ้ำออกจากแถว

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 สำคัญ