انواع enum (مخفف Enumeration) در پایتون یکی از ابزارهای مهم برای تعریف مجموعهای از مقادیر ثابت و یکتا با نامهای معنادار است که به خوانایی و سازماندهی بهتر کد کمک میکند. با استفاده از enum، میتوان از نامهای نمادین بهجای مقادیر دلخواه مانند اعداد یا رشتهها استفاده کرد و این باعث میشود کد نه تنها خواناتر باشد، بلکه از بروز خطاهای احتمالی ناشی از استفاده مقادیر نادرست نیز جلوگیری شود. در این مقاله، به بررسی مزایا، ویژگیها و کاربردهای مختلف enum در پایتون خواهیم پرداخت و با مثالهای کاربردی آن آشنا میشویم.
enum چیست و چرا مفید است؟
enumeration یا enum مجموعهای از نامهای نمادین مرتبط با مقادیر یکتا است که میتوان بر روی آنها پیمایش کرد تا اعضای اصلی آنها به ترتیب تعریف بازگردانده شوند. enumها روشی برای ایجاد کدهایی خواناتر فراهم میکنند، زیرا از نامهای معنادار بهجای مقادیر دلخواه استفاده میکنند.
ویژگیهای enum
- enumها میتوانند به صورت رشته (string) یا repr نمایش داده شوند.
- میتوان enumها را با استفاده از type بررسی کرد.
- از کلمهکلیدی "name" برای نمایش نام عضو enum استفاده میشود.
مزایای استفاده از enum
برخی از مزایای استفاده از enum عبارتند از:
- آسانی در نگهداری: enumها تعریف مقادیر نامی را متمرکز میکنند که این امر به راحتی بهروزرسانی یا گسترش مقادیر بر اساس نیازهای ما کمک میکند.
- خوانایی و خودمستندسازی: enumها به مقادیر نامهای معنادار میدهند و کد را خواناتر و خود توضیحتر میسازند.
- ایمنی نوع: enumها تا حدی ایمنی نوع را فراهم میکنند و اطمینان میدهند که فقط مقادیر معتبر استفاده میشوند.
- کاهش خطر خطا: enumها به جلوگیری از استفاده از مقادیر نادرست یا ناسازگار در کد کمک میکنند و خطر بروز اشکالات را کاهش میدهند.
کلاس enum در پایتون
کد زیر یک کلاس enumeration به نام `Season` را با چهار عضو: `SPRING`، `SUMMER`، `AUTUMN` و `WINTER` تعریف میکند. این کد ویژگیهای کلیدی enum مانند دسترسی به یک عضو enum، نام و مقدار آن را نمایش میدهد. همچنین نشان میدهد چگونه میتوان لیستی از تمام اعضای enum به دست آورد. خروجی نام، مقدار، نوع و لیستی از تمام اعضای enum `Season` را نشان میدهد.
from enum import Enum
class Season(Enum):
SPRING = 1
SUMMER = 2
AUTUMN = 3
WINTER = 4
print(Season.SPRING)
print(Season.SPRING.name)
print(Season.SPRING.value)
print(type(Season.SPRING))
print(repr(Season.SPRING))
print(list(Season))
خروجی:
SPRING
1
<enum 'Season'>
<Season.SPRING: 1>
[<Season.SPRING: 1>, <Season.SUMMER: 2>, <Season.AUTUMN: 3>, <Season.WINTER: 4>]
روشهای دسترسی به اعضای enum
اعضای enum میتوانند به دو روش دسترسی پیدا کنند:
1. با مقدار: در این روش، مقدار عضو enum پاس داده میشود.
2. با نام: در این روش، نام عضو enum پاس داده میشود.
میتوان بهطور جداگانه نام یا مقدار یک عضو را با استفاده از کلمات کلیدی "name" یا "value" به دست آورد.
کد زیر کلاس `Season` را با چهار عضو تعریف میکند و نشان میدهد که چگونه میتوان اعضای enum را با مقدار و نام دسترسی پیدا کرد.
from enum import Enum
class Season(Enum):
SPRING = 1
SUMMER = 2
AUTUMN = 3
WINTER = 4
print("عضو enum مرتبط با مقدار ۲: ", Season(2).name)
print("عضو enum مرتبط با نام AUTUMN: ", Season['AUTUMN'].value)
خروجی:
عضو enum مرتبط با مقدار ۲: SUMMER
عضو enum مرتبط با نام AUTUMN: ۳
قابلیت پیمایش در enumها
enumها قابل پیمایش هستند. میتوان از حلقه for برای نمایش همه اعضای کلاس enum استفاده کرد.
from enum import Enum
class Season(Enum):
SPRING = 1
SUMMER = 2
AUTUMN = 3
WINTER = 4
for season in (Season):
print(season.value, "-", season)
خروجی:
1 - Season.SPRING
2 - Season.SUMMER
3 - Season.AUTUMN
4 - Season.WINTER
حمایت از هشینگ در enum
در این مثال نشان داده میشود که چگونه میتوان کلاس `Enum` را هش کرد و از آن در دیکشنریها یا مجموعهها استفاده کرد.
class Animal(enum.Enum):
dog = 1
cat = 2
lion = 3
di = {}
di[Animal.dog] = 'bark'
di[Animal.lion] = 'roar'
if di == {Animal.dog: 'bark', Animal.lion: 'roar'}:
print("Enum هش شده است")
else:
print("Enum هش نشده است")
خروجی:
مقایسه enumها در پایتون
enumeration از دو نوع مقایسه پشتیبانی میکند:
1. مقایسه هویتی: با استفاده از کلمات کلیدی "is" و "is not" بررسی میشود.
2. مقایسه برابری: مقایسههای برابری با استفاده از `==` و `!=` نیز پشتیبانی میشود.
import enum
class Animal(enum.Enum):
dog = 1
cat = 2
lion = 3
if Animal.dog is Animal.cat:
print("Dog و Cat حیوانات یکسانی هستند")
else:
print("Dog و Cat حیوانات متفاوتی هستند")
if Animal.lion != Animal.cat:
print("Lion و Cat متفاوت هستند")
else:
print("Lion و Cat یکسان هستند")
خروجی:
Lion و Cat متفاوت هستند
پرسشهای متداول در مورد enum در پایتون
چه زمانی باید از enum در پایتون استفاده کنم؟
وقتی مجموعهای از مقادیر ثابت یا مقادیر منطقی مرتبط دارید، استفاده از enum را در نظر بگیرید. enumها راهی برای تعریف نامهای نمادین برای این مقادیر فراهم میکنند که کد شما را خواناتر، قابل نگهداریتر و کمتر دچار خطا میسازند. آنها میتوانند به جای اعداد یا رشتههای جادویی از نامهای معنادار استفاده کنند و از خطاهای احتمالی به دلیل اشتباهات تایپی یا مقادیر نادرست جلوگیری کنند.
انواع enum چیست؟
در پایتون به طور کلی دو نوع enumeration وجود دارد:
1. enumهای تابعی (IntEnum): این enumها از `enum.IntEnum` به ارث میبرند. آنها مانند اعداد صحیح رفتار میکنند و امکان مقایسه و عملیات ریاضی را فراهم میکنند.
2. enumهای مبتنی بر کلاس (Enum): این enumها از `enum.Enum` به ارث میبرند. آنها انعطافپذیرتر هستند و میتوانند هر نوع مقداری را نگه دارند، نه فقط اعداد صحیح. همچنین از روشها و ویژگیهای سفارشی پشتیبانی میکنند.
چرا از enum بهجای کلاس در پایتون استفاده کنیم؟
enumها چندین مزیت نسبت به استفاده از کلاسهای معمولی برای تعریف ثابتها دارند:
- خوانایی: enumها نامهای معنادار به ثابتها میدهند و کد را خواناتر و خودمستند میکنند.
- ایمنی نوع: enumها تضمین میکنند که متغیرها فقط یکی از مقادیر از پیش تعریفشده را بپذیرند و خطر بروز خطاهای ناشی از ورودیهای نامعتبر را کاهش میدهند.
- فضای نام: enumها یک فضای نام برای ثابتهای مرتبط فراهم میکنند و از برخورد نامها جلوگیری میکنند و سازماندهی کد را بهبود میبخشند.
چگونه اعضای enum را به رشته تبدیل کنیم؟
میتوانید اعضای enum را با استفاده از تابع `str()` یا با دسترسی به ویژگی `name` آنها به رشته تبدیل کنید.
python
import enum
class Color(enum.Enum):
RED = 1
GREEN = 2
BLUE = 3
# تبدیل عضو enum به رشته با استفاده از str()
red_color_str = str(Color.RED)
print(red_color_str) # خروجی: 'Color.RED'
# تبدیل عضو enum به رشته با استفاده از ویژگی name
green_color_name = Color.GREEN.name
print(green_color_name)
# خروجی: 'GREEN'
آیا میتوان از enumها بهعنوان کلید در دیکشنریها استفاده کرد؟
بله، شما میتوانید از enumها بهعنوان کلید در دیکشنریها در پایتون استفاده کنید. enumها قابل هش کردن هستند، به این معنی که میتوان از آنها بهعنوان کلید در دیکشنریها و بهعنوان عناصر در مجموعهها استفاده کرد.
python
import enum
class Weekday(enum.Enum):
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
# استفاده از enum بهعنوان کلید در دیکشنری
schedule = {
Weekday.MONDAY: "جلسه",
Weekday.TUESDAY: "ارائه",
Weekday.WEDNESDAY: "آموزش"
}
print(schedule[Weekday.MONDAY])
# خروجی: 'جلسه'
ورود و ثبت نام برای ارسال نظر وارد شوید
¶ من هنوز بلدش نبودم خیلی ممنون از مقالهتون
ورود و ثبت نام برای ارسال نظر وارد شوید