أمثلة Python NamedTuple: كيفية الإنشاء والعمل مع NamedTuples بوضوح وكفاءة

دقائق القراءة: 5

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

شرح مفهوم NamedTuple في Python وكيفية تنظيم البيانات الثابتة بطريقة أوضح

في هذا الدليل، ستتعرّف على كيفية إنشاء NamedTuple في Python، ولماذا تُعد خياراً عملياً في كثير من السيناريوهات، وكيفية استخدامها للوصول إلى القيم بطريقة نظيفة وسهلة الفهم.

ما هو tuple في Python ولماذا قد لا يكون كافياً دائماً؟

يُعد tuple من هياكل البيانات المدمجة في Python، وهو مشابه لـ list من حيث إمكانية تخزين أنواع مختلفة من البيانات داخله، كما يمكن قراءة عناصره وترتيبها بسهولة. لكن الفارق الأهم هو أن tuple غير قابل للتعديل immutable.

هذا يعني أنك بعد إنشاء tuple لا تستطيع تغيير قيمه مباشرة، وهي ميزة مهمة عندما تريد حماية البيانات من التعديل غير المقصود داخل البرنامج.

لنأخذ المثال التالي:

house = ("Bangalore", "India", 2020, 2018, 4)

يمثل هذا tuple معلومات عن منزل، مثل:

  • المدينة
  • الدولة
  • سنة البناء
  • المساحة بالقدم المربعة
  • عدد الغرف

لكن المشكلة هنا أن هذه المعاني غير ظاهرة بشكل مباشر من الكود نفسه. فإذا قرأت هذا السطر بعد عدة أيام، أو اطّلع عليه مطور آخر، فقد يصبح من الصعب معرفة ما إذا كانت القيمة 2020 تشير إلى سنة البناء أو إلى المساحة، وكذلك الأمر بالنسبة إلى 2018.

لذلك، ورغم أن tuple يمنحك الثبات، فإنه لا يوفّر دائماً وضوحاً كافياً في تمثيل البيانات.

هل يمكن استخدام dictionary بدلاً من tuple؟

قد يبدو dictionary بديلاً جيداً، لأنه يسمح بتسمية القيم باستخدام مفاتيح واضحة. يمكن إعادة كتابة المثال السابق بالشكل التالي:

house = {
    "city": "Bangalore",
    "country": "India",
    "year": 2020,
    "area": 2018,
    "num_rooms": 4
}

بهذه الطريقة، يصبح الكود أكثر وضوحاً، لأنك تستطيع الوصول إلى القيم عبر مفاتيح معبّرة مثل:

  • house["city"]
  • house["area"]
  • house["num_rooms"]

لكن dictionary يختلف عن tuple في نقطة مهمة: يمكن تعديل محتواه بسهولة.

house["city"] = "Delhi"

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

لماذا يعتبر NamedTuple حلاً مثالياً؟

NamedTuple في Python يجمع بين ميزتين مهمتين:

  • الثبات الموجود في tuple
  • الوضوح وسهولة القراءة الموجودة في dictionary

وبالتالي، يمكنك إنشاء بنية بيانات ثابتة تحتوي على أسماء حقول واضحة، ثم التعامل معها بطريقة منظمة ومباشرة.

صيغة إنشاء NamedTuple في Python

لاستخدام NamedTuple، عليك أولاً استيراد namedtuple من وحدة collections المدمجة في Python:

from collections import namedtuple

الصيغة العامة للإنشاء تكون كالتالي:

namedtuple(<Name>, <[Names of Values]>)

حيث إن:

  • <Name> هو اسم القالب الذي ستنشئه
  • <[Names of Values]> هي قائمة بأسماء الحقول أو الخصائص

مثال عملي على إنشاء NamedTuple

لنحوّل مثال المنزل السابق إلى NamedTuple أكثر وضوحاً وقابلية لإعادة الاستخدام.

1) استيراد namedtuple

from collections import namedtuple

2) تعريف القالب House

House = namedtuple("House", ["city", "country", "year", "area", "num_rooms"])

في هذا المثال أنشأنا قالباً باسم House يحتوي على الحقول التالية:

  • city
  • country
  • year
  • area
  • num_rooms

3) إنشاء كائنات من NamedTuple

بعد تعريف القالب، يمكنك إنشاء أي عدد من الكائنات بسهولة:

house_1 = House("Bangalore", "India", 2020, 2018, 4)
house_2 = House("Chennai", "India", 2018, 2050, 3)

الميزة هنا أنك لا تحتاج إلى إعادة كتابة أسماء الحقول في كل مرة. يكفي استخدام House كقالب موحد لإنشاء سجلات متعددة بنفس البنية.

كيفية الوصول إلى القيم باستخدام dot notation

بعد إنشاء كائنات NamedTuple، يمكنك الوصول إلى القيم باستخدام dot notation بدلاً من الاعتماد على الفهارس الرقمية.

الصيغة العامة:

<namedtuple_object>.<value_name>

مثال عملي:

print(house_1.city)
print(house_1.country)
print(house_1.year)
print(house_1.area)
print(house_1.num_rooms)

الوصول إلى قيم NamedTuple في Python باستخدام dot notation

وبالمثل، يمكنك استخدام:

  • house_2.city
  • house_2.country
  • house_2.area

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

مقارنة سريعة بين tuple و dictionary و NamedTuple

البنية الوضوح الثبات إعادة الاستخدام
tuple منخفض عند زيادة عدد القيم نعم محدود
dictionary مرتفع لا متوسط مع تكرار المفاتيح
NamedTuple مرتفع نعم ممتاز

تمرين عملي: إنشاء ProblemSet باستخدام NamedTuple

لفهم الفكرة بشكل أعمق، دعنا ننشئ مثالاً آخر باسم ProblemSet. هذا المثال مناسب لتمثيل مجموعة أسئلة برمجية.

1) استيراد namedtuple

from collections import namedtuple

2) تعريف ProblemSet

ProblemSet = namedtuple("ProblemSet", ["num_questions", "difficulty", "topic"])

يتضمن هذا القالب الحقول التالية:

  • num_questions: عدد الأسئلة
  • difficulty: مستوى الصعوبة
  • topic: موضوع مجموعة الأسئلة

3) إنشاء مجموعات أسئلة مختلفة

problem_set1 = ProblemSet(5, "Easy", "Strings")
problem_set2 = ProblemSet(3, "Hard", "Bit Manipulation")

4) قراءة القيم باستخدام dot notation

print(problem_set1.topic)  # Output: Strings
print(problem_set2.difficulty)  # Output: Hard

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

متى يُفضّل استخدام NamedTuple؟

يُفضّل استخدام NamedTuple عندما تكون لديك بيانات:

  • مرتبطة ببعضها ضمن كيان واحد
  • لا تحتاج إلى تعديل بعد الإنشاء
  • تتطلب وضوحاً أكبر من tuple التقليدي
  • تحتاج إلى إنشاء نسخ متعددة منها باستخدام قالب موحد

ومن الأمثلة الشائعة على ذلك:

  • تمثيل الإحداثيات
  • بيانات المستخدمين المبسطة
  • وصف عناصر ثابتة في النظام
  • نتائج الاستعلامات أو السجلات المؤقتة

ما الفرق بين NamedTuple و class في Python؟

إذا كنت على دراية بمفاهيم OOP في Python، فقد تلاحظ أن NamedTuple يشبه class من حيث وجود قالب يحتوي على خصائص يمكن إنشاء كائنات منه.

لكن الفرق أن class أكثر مرونة وتعقيداً، ويُستخدم عادة عندما تحتاج إلى:

  • سلوكيات إضافية عبر methods
  • تعديلات داخلية على البيانات
  • وراثة أو منطق أعمال أكثر تقدماً

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

فوائد NamedTuple في كتابة كود احترافي

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

الخلاصة التقنية

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *