شعار زيفيرنت

Python Enum: كيفية بناء التعدادات في Python – KDnuggets

التاريخ:

Python Enum: كيفية بناء التعدادات في Python
صورة المؤلف
 

إذا كنت قد برمجت بلغة مثل C++ أو Java، فمن المحتمل أنك استخدمت التعدادات لإنشاء ثوابت مسماة. تكون التعدادات مفيدة عندما يكون لديك متغير يأخذ واحدة من عدد ثابت من القيم - غالبًا ما تكون ذات صلة مثل أيام الأسبوع، ودرجات الطلاب، وحالة الطلب، وما شابه.

ومع ذلك، لا تحتوي لغة بايثون على نوع بيانات تعداد واضح. ولكن يمكنك استخدام وحدة التعداد في مكتبة Python القياسية لإنشاء التعدادات. وهذا البرنامج التعليمي سوف يعلمك كيف. 

هيا بنا نبدأ!

يرمز التعداد إلى "التعداد" ويتكون من مجموعة من الثوابت المسماة المحددة مسبقًا. غالبًا ما ترتبط هذه الثوابت. تتضمن الأمثلة الشائعة أشهر السنة وأيام الأسبوع والدرجات والترتيب وحالات المهام. 

خلاصة القول: التعداد هو في الأساس مجموعة من الثوابت المترابطة، حيث يكون لكل ثابت اسم ذو معنى مرتبط به.

في بايثون، يمكنك إنشاء التعدادات باستخدام وحدة التعداد (وهو ما سنفعله قريبًا!).

لماذا استخدام التعدادات

يساعد استخدام التعدادات على تحسين وضوح التعليمات البرمجية وقابلية صيانتها. إليك الطريقة: 

  • تعمل التعدادات على تحسين وضوح التعليمات البرمجية عن طريق استبدال الأرقام أو السلاسل السحرية بتسميات ذات معنى. كما أنها تجعل الكود أكثر توثيقًا ذاتيًا لأن أسماء أعضاء التعداد تنقل غرضهم. 
  • تعمل التعدادات على تحسين إمكانية صيانة التعليمات البرمجية من خلال توفير طريقة بسيطة لتحديد وإدارة الثوابت ذات الصلة. 
  • من خلال تقييد تعيينات المتغيرات على قيم التعداد الصالحة فقط، تضمن التعدادات أيضًا سلامة النوع. 
  • تسهل التعدادات التكرار السهل والمقارنة بين الثوابت ذات الصلة.

الآن لنقم بإنشاء أول تعداد لنا في بايثون.

سنقوم بإنشاء TaskStatus التعداد الذي يأخذ الأسماء والقيم الأربعة التالية:

 

Python Enum: كيفية بناء التعدادات في Python
صورة المؤلف
 

أولاً ، نقوم باستيراد ملف Enum فئة من وحدة التعداد لإنشاء التعدادات. 

ثم نقوم بتحديد فئة جديدة TaskStatus الذي يرث من Enum لإنشاء التعداد. يتم تعريف كل عضو باسم فريد وقيمة اختيارية مثل:

from enum import Enum
	 
class TaskStatus(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

جميع أعضاء التعداد الذي نقوم بإنشائه هم مثيلات لفئة Enum. يمكنك التحقق من ذلك عن طريق الاتصال على isinstance() وظيفة كما هو مبين:

print(isinstance(TaskStatus.TODO,Enum))

 

Output >>> True

 

دعونا نطبع جميع الأعضاء في TaskStatus التعداد عن طريق وضعه في القائمة:

print(list(TaskStatus))

 

سترى الإخراج التالي:

Output >>>

[<TaskStatus.TODO: 0>, <TaskStatus.IN_PROGRESS: 1>, <TaskStatus.DONE: 2>, <TaskStatus.ABANDONED: -1>]

 

جميع أعضاء التعداد لديهم الاسم و قيمنا. مما يعني أنه يمكنك الوصول إلى أعضاء التعداد باستخدام أسمائهم، مثل TaskStatus.TODO. أو يمكنك الوصول إليها حسب القيمة، مثل TaskStatus(0).

الآن بعد أن أنشأنا بسيطة TaskStatus التعداد، دعونا نتعلم كيفية تنفيذ مهام بسيطة مثل التكرار على أعضاء التعداد.

التكرار على التعدادات

في Python، يمكنك العمل مع التعدادات بنفس الطريقة التي تعمل بها مع أي كائن قابل للتكرار. على سبيل المثال، يمكنك استخدام len() وظيفة لحساب عدد أعضاء التعداد:

num_statuses = len(TaskStatus)
print(num_statuses)

 

Output >>> 4

 

يمكنك أيضًا التكرار عبر التعدادات تمامًا كما تفعل مع قائمة Python القابلة للتكرار. في حلقة for التالية، يمكننا الوصول إلى اسم وقيمة كل عضو من أعضاء التعداد وطباعتهما:

for status in TaskStatus:
    print(status.name, status.value)

 

وهنا الإخراج:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

الطلب في التعدادات

في المثال، الحالة والقيمة الرقمية المقابلة هي كما يلي:

  • المهام: 0
  • IN_PROGRESS: 1
  • تم: 2
  • مهجور: -1

ولكن يمكنك أيضًا استخدام الترتيب الافتراضي باستخدام auto() وظيفة مساعد. عند القيام بذلك، إذا كان لديك أعضاء 'n' في التعداد، فإن القيم المخصصة هي من 1 إلى n. ولكن يمكنك تمرير قيمة البداية، على سبيل المثال k، auto(k) ليبدأ التعداد عند k ويصل إلى k + n.

دعونا تعديل TaskStatus التعداد كما هو مبين:

from enum import Enum, auto

class TaskStatus(Enum):
    TODO = auto()
    IN_PROGRESS = auto()
    DONE = auto()
    ABANDONED = auto()

 

الآن دعونا نطبع الأعضاء:

print(list(TaskStatus))

 

نرى أن القيم هي من 1 إلى 4 كما هو متوقع:

Output >>>

[<TaskStatus.TODO: 1>, <TaskStatus.IN_PROGRESS: 2>, <TaskStatus.DONE: 3>, <TaskStatus.ABANDONED: 4>]

الآن دعونا نبني على TaskStatus التعداد الذي لدينا. قم بإنشاء ملف Task.py في دليل العمل الخاص بك باستخدام الإصدار التالي من التعداد:

# task.py

from enum import Enum

class TaskState(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

لنفترض أن لدينا مهمة باسم وحالة حالية. والانتقالات الصحيحة بين الحالات هي كما هو موضح:

 

Python Enum: كيفية بناء التعدادات في Python
صورة المؤلف
 

دعونا إنشاء Task صف دراسي:

class Task:
    def __init__(self, name, state):
        self.name = name
        self.state = state
    
    def update_state(self, new_state):
        # Define valid state transitions based on the current state
        valid_transitions = {
        	TaskState.TODO: [TaskState.IN_PROGRESS, TaskState.ABANDONED],
        	TaskState.IN_PROGRESS: [TaskState.DONE, TaskState.ABANDONED],
        	TaskState.DONE: [],
        	TaskState.ABANDONED: []
    	}
   	 
        # Check if the new state is a valid transition from the current state
        if new_state in valid_transitions[self.state]:
            self.state = new_state
        else:
            raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")

 

لدينا update_status() الطريقة التي تتحقق مما إذا كان الانتقال إلى الحالة الجديدة صالحًا في ظل الحالة الحالية. بالنسبة للانتقالات غير الصالحة، يتم ظهور استثناء ValueError.

وهنا مثال على Task الفئة: مهمة "كتابة التقرير" مع الحالة TODO:

# Create a new task with the initial state "To Do"
task = Task("Write Report", TaskState.TODO)

# Print the task details
print(f"Task Name: {task.name}")
print(f"Current State: {task.state.name}")

 

Output >>>
Task Name: Write Report
Current State: TODO

 

يجب أن يعمل تحديث حالة المهمة إلى IN_PROGRESS لأنه انتقال صالح للحالة:

# Update the task state to "In Progress"
task.update_state(TaskState.IN_PROGRESS)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: IN_PROGRESS

 

وبمجرد اكتمال المهمة، يمكننا تحديث حالتها إلى تم:

# Update the task state to "DONE"
task.update_state(TaskState.DONE)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: DONE

 

ولكن إذا حاولت تحديث الحالة إلى حالة غير صالحة، مثل محاولة تحديث DONE إلى TODO، فسوف تواجه استثناء ValueError:

# Attempt to update the task state to an invalid state
task.update_state(TaskState.TODO)

 

فيما يلي تتبع خطأ القيمة الذي تم رفعه بسبب انتقال الحالة غير الصالح من DONE إلى TODO:

Traceback (most recent call last):
  File "/home/balapriya/enums/task.py", line 46, in 
	task.update_state(TaskState.TODO)
  File "/home/balapriya/enums/task.py", line 30, in update_state
	raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")
ValueError: Invalid state transition from DONE to TODO

في هذا البرنامج التعليمي، تعلمنا كيفية بناء التعدادات في بايثون عن طريق ترميز تعداد TaskStatus بسيط. لقد تعلمنا كيفية الوصول إلى أعضاء التعداد والتكرار عليهم. 

لقد تعلمنا أيضًا كيفية عمل الترتيب الافتراضي إذا اخترت استخدام auto() وظيفة مساعدة لتعيين القيم لأعضاء التعداد. ثم حاولنا استخدام تعداد TaskStatus في مثال أكثر فائدة. 

يمكنك العثور على أمثلة التعليمات البرمجية على جيثب. أراكم جميعًا قريبًا في برنامج تعليمي آخر لبايثون. حتى ذلك الحين، برمجة سعيدة!
 
 

بالا بريا سي مطور وكاتب تقني من الهند. تحب العمل في تقاطع الرياضيات والبرمجة وعلوم البيانات وإنشاء المحتوى. تشمل مجالات اهتمامها وخبرتها DevOps وعلوم البيانات ومعالجة اللغة الطبيعية. تستمتع بالقراءة والكتابة والترميز والقهوة! تعمل حاليًا على التعلم ومشاركة معرفتها مع مجتمع المطورين من خلال تأليف برامج تعليمية وأدلة إرشادية ومقالات رأي والمزيد.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة