شم

شمارشی در Python

1 تمرین

درباره‌ی شمارشی

در Python، enum مجموعه‌ای از نام‌های یکتاست که هر یک به مقادیر ثابت و یکتا گره خورده‌اند. Enums با ارث‌بری از کلاس Enum تعریف می‌شوند. انواع enum توکار در ماژول enum در دسترس‌اند و کلاس Enum را می‌توان با from enum import Enum وارد کرد.

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2

توجه کنید که مقادیر اعضای enum می‌توانند هر نوع داده‌ای مانند str، tuple، float و غیره باشند.

class Color(Enum):
    RED = 'red'
    GREEN = 'green'

Enums را همچنین می‌توان با نحوه‌ی نگارش فراخوانی تابع ساخت.

from enum import Enum

Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]

Animal.ANT.value
#=> 1

وقتی مقدار یکسانی به دو عضو در یک enum اختصاص می‌دهید، عضوی که بعداً اختصاص داده شده، نام مستعار عضوی خواهد بود که اول آمده است. استفاده از نام یکسان برای دو عضو متفاوت یک enum مجاز نیست.

class Color(Enum):
    RED = 1
    GREEN = 2
    ALIAS_OF_RED = 1

Color.ALIAS_OF_RED
#=> <Color.RED: 1>

پیمایش اعضای enum را می‌توان با نحوه‌ی نگارش استاندارد for member in انجام داد:

for member in Color:
    print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)

# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
    print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)

اعضای Enum را می‌توان با is (عملگر اینهمانی) یا is not مقایسه کرد. عملگرهای == و != (عملگرهای برابری) هم به همین شکل کار می‌کنند:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

برای اختصاص مقادیر صحیح، تابع auto() از 1 شروع می‌کند و مقادیر بعدی را به‌طور خودکار تعیین می‌کند.

class Shape(Enum):
    CIRCLE = auto()
    SQUARE = auto()
    OVAL = auto()

برای جلوگیری از نام مستعار (جلوگیری از مقادیر تکراری با نام‌های متفاوت)، می‌توان از تزئین‌گر کلاس @enum.unique استفاده کرد.

@enum.unique
class Shape(Enum):
    CIRCLE = 1
    SQUARE = 2
    TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE

برای دسترسی به یک عضو enum با یک مقدار مشخص، می‌توان از این نحوه‌ی نگارش استفاده کرد: <EnumName>(<value>).

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

می‌توان یک Enum محدود سفارشی را با زیرکلاس‌سازی کلاس Enum به‌همراه هر mix-in یا نوع داده‌ای نوشت. برای مثال:

class StrEnum(str, Enum):
    pass

زیرکلاس‌سازی Enum تنها زمانی مجاز است که آن enum هیچ عضوی تعریف نکند. برای جزئیات و توضیحات بیشتر، راهنمای enum و enum cookbook را ببینید.

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود