
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
- ใช้
StrEnumเมื่อค่าคงที่คือข้อความที่ต้องเทียบ/ต่อสตริงบ่อย - ใช้
Enumปกติเมื่ออยากกันการเทียบกับสตริงแบบเผลอๆ - เวลา serialize ให้ตัดสินใจให้ชัดว่าจะส่งชื่อสมาชิกหรือค่า
- เขียนเทสต์สั้นๆ กัน regression ตอนรีแฟกเตอร์สถานะ