آموزش پایتون - Enumها

Enumها در پایتون

در پایتون، اصطلاح شمارش (enumeration) به فرآیند اختصاص مقادیر ثابت به مجموعه‌ای از رشته‌ها اشاره دارد، به‌طوری که هر رشته با مقداری که به آن متصل است شناخته می‌شود. کلاس Enum موجود در ماژول enum (که بخشی از کتابخانه استاندارد پایتون است) به‌عنوان کلاس والد برای تعریف شمارشِ مجموعه‌ای از شناسه‌ها — که طبق معمول با حروف بزرگ نوشته می‌شوند — استفاده می‌شود.

مثال

در کد زیر، "subjects" یک شمارش است. این شمارش دارای اعضای مختلفی است و هر عضو، یک شیء از کلاس شمارش subjects محسوب می‌شود. این اعضا دارای ویژگی‌های name و value هستند.

# importing enum 
from enum import Enum

class subjects(Enum):
   ENGLISH = 1
   MATHS = 2
   SCIENCE = 3
   SANSKRIT = 4

obj = subjects.MATHS
print (type(obj))

این کد منجر به خروجی زیر می‌شود −

<enum 'subjects'> 

یک کلاس enum نمی‌تواند عضو تکراری داشته باشد، با این حال می‌توان به بیش از یک عضو، یک مقدار یکسان اختصاص داد. برای اطمینان از اینکه هر عضو دارای یک مقدار منحصربه‌فرد است، از دکوراتور @unique استفاده کنید.

مثال

در این مثال، ما از دکوراتور @unique برای جلوگیری از تکراری بودن مقادیر استفاده می‌کنیم.

from enum import Enum, unique

@unique
class subjects(Enum):
   ENGLISH = 1
   MATHS = 2
   GEOGRAPHY = 3
   SANSKRIT = 2

این کار باعث بروز یک استثنا (exception) مطابق زیر می‌شود −

   @unique
    ^^^^^^
   raise ValueError('duplicate values found in %r: %s' %
ValueError: duplicate values found in <enum 'subjects'>: SANSKRIT -> MATHS

کلاس Enum یک کلاس قابل فراخوانی (callable) است، بنابراین می‌توانید از سازنده (constructor) آن برای ایجاد یک شمارش استفاده کنید. این سازنده دو آرگومان می‌پذیرد که عبارت‌اند از: نام شمارش و یک رشته شامل نام‌های نمادین اعضای شمارش که با فاصله (whitespace) از هم جدا شده‌اند.

مثال

در ادامه یک روش جایگزین برای تعریف یک شمارش آورده شده است −

from enum import Enum
subjects = Enum("subjects", "ENGLISH MATHS SCIENCE SANSKRIT")
print(subjects.ENGLISH)
print(subjects.MATHS)
print(subjects.SCIENCE)
print(subjects.SANSKRIT)

این کد خروجی زیر را تولید خواهد کرد −

subjects.ENGLISH
subjects.MATHS
subjects.SCIENCE
subjects.SANSKRIT

حالت‌های دسترسی در Enumها

اعضای یک کلاس enum را می‌توان به دو حالت دسترسی داشت −

  • مقدار (Value) − در این حالت، مقدار عضو enum با استفاده از کلمه کلیدی "value" بعد از شیء کلاس enum قابل دسترسی است.

  • نام (Name) − به همین ترتیب، از کلمه کلیدی "name" برای دسترسی به نام عضو enum استفاده می‌کنیم.

مثال

مثال زیر نحوه دسترسی به مقدار و نام عضو enum را نشان می‌دهد.

from enum import Enum

class subjects(Enum):
   ENGLISH = "E"
   MATHS = "M"
   GEOGRAPHY = "G"
   SANSKRIT = "S"
   
obj = subjects.SANSKRIT
print(type(obj))
print(obj.name)
print(obj.value)

این کد خروجی زیر را تولید خواهد کرد −

<enum 'subjects'> 
SANSKRIT
S

پیمایش در Enumها

شما می‌توانید با کمک یک حلقه for، اعضای enum را به ترتیب ظهور آن‌ها در تعریف، پیمایش کنید.

مثال

مثال زیر نحوه پیمایش در یک شمارش را با استفاده از حلقه for نشان می‌دهد −

from enum import Enum

class subjects(Enum):
   ENGLISH = "E"
   MATHS = "M"
   GEOGRAPHY = "G"
   SANSKRIT = "S"

for sub in subjects:
   print (sub.name, sub.value)

این کد خروجی زیر را تولید خواهد کرد −

ENGLISH E
MATHS M
GEOGRAPHY G
SANSKRIT S

می‌دانیم که به عضو enum می‌توان هم با مقدار منحصربه‌فرد اختصاص‌یافته به آن و هم با ویژگی name آن دسترسی داشت. بنابراین، subjects("E") و همچنین subjects["ENGLISH"] هر دو عضو subjects.ENGLISH را برمی‌گردانند.

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.