ال

التعدادات في Python

1 تمرين

نبذة عن التعدادات

في Python، التعداد هو مجموعة من الأسماء الفريدة المرتبطة بقيم فريدة وثابتة. تُعرَّف Enums بالوراثة من صنف 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>

يمكن التكرار على أعضاء التعداد باستخدام الصيغة المعتادة 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 مع أي صنف مزيج أو نوع بيانات. على سبيل المثال:

class StrEnum(str, Enum):
    pass

لا يُسمح بإنشاء صنف فرعي من Enum إلا إذا كان enum لا يعرّف أي أعضاء. راجع دليل enum الإرشادي وكتاب وصفات enum لمزيد من التفاصيل والشروح.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة