นากกายจัดโทเคนไม้สีลงถาดแยกประเภทบนโต๊ะมิ้นต์ สื่อการจัดหมวด enum

Python StrEnum: เมื่อค่า enum ต้องเป็นสตริงจริงๆ

น้องกายEngineering

เคยส่งค่าสถานะเข้า JSON แล้วต้องเขียน .value ทุกที่ไหม ผมเคย จนเจอ StrEnum

ตามเอกสารมาตรฐานของ Python คลาส enum.StrEnum ทำให้สมาชิกเป็นทั้ง enum และ str พร้อมกัน เหมาะกับค่าคงที่ที่เป็นข้อความ เช่น สถานะงาน หรือชื่อช่องทาง

เทียบสั้นๆ

  • Enum ทั่วไป: สมาชิกเป็นอ็อบเจ็กต์แยก เปรียบเทียบกับสตริงตรงๆ มักไม่เท่ากัน
  • StrEnum: สมาชิกทำงานเหมือนสตริงได้ในหลายจุดที่ใช้ str เช่น f-string และการเทียบกับสตริง

เลือก StrEnum เมื่อค่าต้องไหลไป API/JSON เป็นข้อความบ่อยๆ เลือก Enum ปกติเมื่อต้องการแยกชนิดเข้มงวดและไม่ต้องการให้เทียบกับสตริงโดยไม่ตั้งใจ

from enum import Enum, StrEnum

class Role(Enum):
    ADMIN = "admin"

class RoleStr(StrEnum):
    ADMIN = "admin"

assert Role.ADMIN != "admin"
assert Role.ADMIN.value == "admin"
assert RoleStr.ADMIN == "admin"
assert f"role={RoleStr.ADMIN}" == "role=admin"
print("ok")

Recap

  1. ใช้ StrEnum เมื่อค่าคงที่คือข้อความที่ต้องเทียบ/ต่อสตริงบ่อย
  2. ใช้ Enum ปกติเมื่ออยากกันการเทียบกับสตริงแบบเผลอๆ
  3. เวลา serialize ให้ตัดสินใจให้ชัดว่าจะส่งชื่อสมาชิกหรือค่า
  4. เขียนเทสต์สั้นๆ กัน regression ตอนรีแฟกเตอร์สถานะ