1. المقدمة
البنية "if **name** == '**main**'" التي تُرى كثيرًا في برامج بايثون هي ميزة مهمة لتحديد كيفية تنفيذ السكريبت. باستخدام هذه البنية، يمكن لنفس الشيفرة أن تتصرف بشكل مختلف اعتمادًا على ما إذا تم “تشغيلها مباشرة” أو “استيرادها من سكريبت آخر”.
من خلال الفهم الصحيح لهذه الميزة، يمكنك تحسين قابلية إعادة استخدام الشيفرة وصيانتها، وتمكين تصحيح الأخطاء والاختبار بشكل أكثر كفاءة. في هذه المقالة، نشرح بالتفصيل دور هذه البنية، واستخدامها، وفوائدها، مع أمثلة شيفرة ملموسة.
2. الفهم الأساسي لـ name و main في بايثون
ما هو المتغير الخاص name في بايثون؟
عند تنفيذ برنامج بايثون، يتم إنشاء عدة متغيرات خاصة تلقائيًا. __name__ هو أحد هذه المتغيرات ويخزن اسم الملف (الوحدة) الذي يتم تنفيذه. عادةً ما يشير المتغير __name__ إلى الوحدة التي تم تشغيل البرنامج منها.
ملاحظة: الفرق بين الوحدة والسكريبت الوحدة: ملف يحتوي على شيفرة بايثون مصمم ليتم استيراده واستخدامه من قبل ملفات أخرى.
السكريبت: ملف بايثون يُقصد به أن يُنفّذ كبرنامج، عادةً لا يتم استيراده من ملفات أخرى بل يُشغَّل مباشرة.
مثال: سلوك name
على سبيل المثال، تخيل ملف example.py بالمحتوى التالي.
# example.py
print(__name__)
إذا شغلت هذا الملف مباشرة، تصبح قيمة __name__ هي '__main__'، وسيظهر الطرفية ما يلي:
__main__
من ناحية أخرى، عندما يتم استيراد الملف من ملف آخر، تُضبط قيمة __name__ إلى اسم الملف 'example' بدلاً من __main__. هذا يُظهر أن قيمة __name__ تتغير حسب طريقة تشغيل السكريبت.
ما هو main؟
مُفسِّر بايثون يعيّن الاسم الخاص “__main__” إلى الملف الذي يتم تنفيذه. هذا يسمح لبرنامج بايثون بالتأكد من أن السكريبت يُشغَّل مباشرةً عن طريق فحص “__main__“. 
3. الاستخدام العملي لـ if name == ‘main‘
استخدام البنية “if name == ‘main‘” يتيح لك تنفيذ شيفرة معينة فقط عندما يُشغَّل سكريبت بايثون مباشرة. هذه البنية مفيدة جدًا للحصول على تحكم أفضل في سلوك الشيفرة.
الصياغة الأساسية
if __name__ == '__main__':
# Code that runs only when the script is executed directly
print("This script is being run directly.")
مثال ملموس
فيما يلي شيفرة تستخدم ملف calculate.py كمثال. يحتوي هذا الملف على دالة وجملة شرطية.
# calculate.py
def add(a, b):
return a + b
if __name__ == '__main__':
result = add(3, 4)
print("Calculation result:", result)
نتيجة التنفيذ
إذا شغلت هذا الملف مباشرة، سيظهر الإخراج التالي.
Calculation result: 7
من ناحية أخرى، إذا تم استيراد وحدة calculate من ملف آخر، فإن الشيفرة التي تقع بعد if __name__ == '__main__' لن تُنفّذ. إليك مثالًا على استيراده واستخدامه من ملف آخر، main_script.py.
# main_script.py
import calculate
# When imported, the code under if __name__ == '__main__' in calculate.py is not executed
print(calculate.add(10, 5)) # 15 is printed
كما هو موضح، استخدام البنية “if name == ‘main‘” يتيح لك جعل السكريبت يتصرف بشكل مختلف عندما يُشغَّل مباشرةً مقارنةً عندما يتم استيراده من سكريبت آخر.
4. فوائد استخدام هذه البنية
1. تحسين قابلية إعادة استخدام الوحدة
استخدام 「if name == ‘main‘」 يحسّن من قابلية إعادة استخدام الوحدة. فهو يمنع تشغيل شيفرة غير ضرورية عندما يتم استيراد الوحدة ويسمح لك بالتحكم في تنفيذ الأجزاء الضرورية فقط، مما يحسّن صيانة الشيفرة.
2. تسهيل الاختبار
من خلال وضع شيفرة الاختبار أو التصحيح داخل if __name__ == '__main__'، يمكنك تشغيل الاختبارات بسهولة أثناء التطوير. لأن شيفرة الاختبار لن تُنفّذ عندما يتم استيراد الوحدة، يمكنك تصحيح الأخطاء بشكل أكثر كفاءة.
مثال على شيفرة اختبار
لنضيف اختبارًا بسيطًا إلى calculate.py.
# calculate.py
def add(a, b):
return a + b
if __name__ == '__main__':
# Test code
print("3 + 4 =", add(3, 4))
print("10 + 5 =", add(10, 5))
بهذه الطريقة، من خلال تشغيل الاختبارات البسيطة فقط عندما يتم تنفيذ الوحدة مباشرةً، لن يتم تشغيل الاختبارات عندما يتم استيراد الوحدة من قبل كود آخر، وسيتم استخدام الدوال الضرورية فقط. 
5. الاحتياطات وأفضل الممارسات
الاحتياطات
- تحسين وضوح الكود
if __name__ == '__main__'ضع كود الاختبار والتنفيذ أسفل هذه النقطة لتفصل بوضوح المسؤوليات داخل الملف. تأكد من أن الأجزاء التي لا يجب تشغيلها عند الاستيراد محاطة بالشرط بحيث لا يتم تشغيل الكود غير الضروري عن طريق الخطأ. - احذر من الاستيرادات الدائرية إذا كانت ملفات متعددة تستورد بعضها البعض في الكود باستخدام
if __name__ == '__main__'، احرص على تجنب الاستيرادات الدائرية. الاعتمادات المعقدة للوحدات تزيد من خطر الاستيرادات الدائرية، لذا حاول الحفاظ على الاعتمادات بسيطة.
أفضل الممارسات
- ضع كود الاختبار في كتلة رئيسية من خلال وضع كود الاختبار داخل
if __name__ == '__main__'، تمنع التنفيذ غير الضروري عندما يتم استيراد الوحدة من قبل كود آخر. ضمان تشغيل الاختبارات فقط عندما يتم تنفيذ الوحدة مباشرةً يساعد على تجنب السلوك غير المقصود. - اجمع الدوال ذات الصلة معًا من خلال تجميع الدوال ذات الصلة داخل
if __name__ == '__main__'واستدعائها حسب الحاجة، يبقى كودك مختصرًا، أسهل للقراءة، وأبسط للصيانة.
6. الملخص
إن بنية “if name == ‘main‘” هي طريقة مريحة لتحديد كيفية تنفيذ سكريبت بايثون. باستخدام هذه البنية، يمكنك التأكد من أن الكود يعمل فقط عندما يتم تنفيذ السكريبت مباشرةً، مما يحسن قابلية إعادة استخدام الوحدة ويسهل الاختبار. عند البرمجة بلغة بايثون، استخدم هذه البنية بفعالية وافصل بين السكريبتات والوحدات بشكل مناسب لتعزيز صيانة الكود وإعادة استخدامه.




