سطح مقدماتی (Beginner Level)
زمانی که در کدنویسی با مجموعهای از مقادیر ثابت و مرتبط سر و کار داریم (مثل روزهای هفته، وضعیتهای سفارش، یا رنگهای اصلی)، استفاده از رشتهها یا اعداد ساده (Magic Numbers) میتواند باعث بروز خطا و کاهش خوانایی کد شود. در این بخش یاد میگیریم چگونه با Enum کد تمیزتری بنویسیم.
مفهوم Enum و چرایی استفاده از آن
فرض کنید برای وضعیت یک سفارش از اعداد 0، 1 و 2 استفاده میکنید. اگر جای دیگری از کد فراموش کنید که 2 به چه معناست، با مشکل مواجه میشوید. Enum (شمارشی) به این اعداد نامهای بامعنا میدهد.

مثال ۱: تعریف یک Enum ساده
برای تعریف، باید کلاسی بسازید که از Enum ارثبری کند.
دسترسی و پیمایش (Iteration)
شما میتوانید روی اعضای یک Enum حلقه بزنید، دقیقا شبیه به لیستها. این کار برای ساختن لیستهای انتخابی (Dropdowns) در برنامهها بسیار مفید است.
مثال ۲: حلقه روی Enum
مثال ۳: مقایسه ایمن
استفاده از Enum به ما کمک میکند تا مقایسه ایمنتری داشته باشیم (با استفاده از عملگر is یا ==).
# Static Code (Comparison Logic Snippet)
def check_status(status):
# مقایسه بسیار خوانا و ایمن
if status is OrderStatus.DELIVERED:
return "سفارش تحویل داده شده است."
return "در انتظار..."
سطح پیشرفته (Professional Level)
در پروژههای بزرگ، نیاز به کنترل بیشتر روی مقادیر، ترکیب با اعداد صحیح، تولید خودکار مقادیر و مدیریت پرچمهای بیتی (Bitwise Flags) داریم.
استفاده از auto() و دکوریتور @unique
گاهی اوقات مقدار دقیق (1, 2, 3) مهم نیست و فقط متمایز بودن آنها مهم است. تابع auto() این کار را خودکار انجام میدهد. همچنین دکوریتور @unique تضمین میکند که هیچ دو عضوی مقدار تکراری نداشته باشند.
مثال ۴: تولید خودکار مقادیر
کلاس IntEnum (سازگاری با اعداد)
به طور پیشفرض، اعضای Enum با اعداد صحیح برابر نیستند (حتی اگر مقدارشان عدد باشد). اگر نیاز دارید که Enum شما مثل یک عدد رفتار کند (مثلاً برای ذخیره در دیتابیس یا مقایسه ریاضی)، از IntEnum استفاده کنید.
مثال ۵: تفاوت Enum و IntEnum
کلاس Flag (عملیات بیتی)
زمانی که یک متغیر میتواند چندین حالت همزمان داشته باشد (مثلاً یک فایل هم خواندنی باشد و هم نوشتنی)، از Flag استفاده میکنیم. این جایگزین ماسکهای بیتی (Bitwise Masks) قدیمی است.
مثال ۶: ترکیب حالتها با Flag
نکات فنی و Best Practice ها
- نامگذاری: طبق قرارداد PEP8، نام اعضای Enum باید
UPPER_CASEباشد. - توسعهپذیری: کلاسهای Enum استاندارد در پایتون قابل ارثبری (Subclassing) نیستند مگر اینکه کلاس والد هیچ عضوی نداشته باشد (میکسین).
- تبدیل مقدار به Enum: میتوانید با پاس دادن مقدار به کلاس، عضو مربوطه را بگیرید.