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

في هذا الدليل، ستتعرّف على كيفية إنشاء 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 يحتوي على الحقول التالية:
citycountryyearareanum_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)

وبالمثل، يمكنك استخدام:
house_2.cityhouse_2.countryhouse_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 يمنحك كوداً أنظف وأسهل في الصيانة، وهي ميزة مهمة في تطوير البرمجيات الاحترافي.