logo

__name__ في بايثون

يتم تخزين اسم البرنامج النصي أو الوحدة التي يتم تنفيذها حاليًا في Python في المتغير الخاص __name__ الخاص بـ Python. قدم Python 3.0 المتغير __name__، وهو غائب عن Python 2.x. يتم تعيين قيمة البرنامج النصي أو الوحدة النمطية الحالية لـ Python، __main__، إلى المتغير __name__ أثناء تشغيله.

ماذا يعني _الاسم_ ؟

تحتوي لغة Python على متغير مدمج يسمى __name__ يخزن اسم البرنامج النصي أو الوحدة التي يتم تنفيذها حاليًا. يتم تخزين البرنامج النصي أو اسم الوحدة في المتغير __name__ ما لم تكن الوحدة الحالية قيد التشغيل، وفي هذه الحالة يتم تعيين القيمة __main__ لها.

وبالتالي، عند تنفيذ برنامج نصي لـ Python، يجب أن تكون قيمة المتغير __name__ الخاص به دائمًا __main__ إذا تم استيراده إلى برنامج Python آخر. إذا لم يكن الأمر كذلك، فسيظهر اسم الوحدة.

مثال :

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

 # Code to define a function def anything(): print('Value of the __name__ : ', __name__) anything() 

انتاج:

 Value of the __name__ : __main__ 

توضيح:

يتم تشغيل البرنامج النصي على الفور باعتباره البرنامج الرئيسي، كما هو موضح في الإخراج 'قيمة الاسم: main'. في Python، يتم تعيين قيمة المتغير __name__ الخاص بالبرنامج النصي تلقائيًا إلى '__main__' عند تنفيذ البرنامج النصي مباشرةً. يؤكد هذا الإخراج أن البرنامج النصي يتم تشغيله مباشرة بدلاً من استيراده كوحدة نمطية إلى برنامج نصي آخر

لنقم الآن ببناء برنامج نصي آخر لبايثون يسمى mains.py واستيراد السابق فيه.

مثال :

 # importing testing.py import testing testing.anything() 

انتاج:

 Value of the __name__ : testing 

توضيح:

اختبارات. أي شيء () هي الطريقة التي يتم تشغيلها عند استيراد البرنامج النصي test.py إلى برنامج Python آخر باستخدام اختبار الاستيراد. في هذه الحالة، يتم تعيين اسم الوحدة، في هذه الحالة 'اختبار'، كقيمة للمتغير __name__ في test.py بدلاً من '__main__'. ولهذا السبب، فإن إخراج الاختبار. أي شيء () هو 'قيمة __name__: الاختبار.' يوضح هذا كيف يؤثر تشغيل البرنامج النصي مباشرة مقابل استيراده كوحدة على قيمة المتغير __name__.

استخدام الشرط if name == main :

نحن نستخدم ال إذا بيان والحالة __الاسم__ == __الرئيسي__ ليعلن ذلك رمز بايثون معين يجب أن يكون فقط يتم تنفيذها عند تشغيل البرنامج النصي مباشرة .

مثال :

 # importing testing.py import testing if __name__ == __main__: testing.anything() 

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

مثال رمزي للاسم في بايثون:

كما ذكرنا من قبل، عندما نقوم بتشغيل ملف تعليمات برمجية، يتم تنفيذ التعليمات البرمجية مباشرة - ولا يتم استيرادها حتى إلى ملف آخر - ونتيجة لذلك، تتغير قيمة المتغير __name__ إلى __main__.

 # defining a function def anything(): print('It is a function in the ScriptP1.') if __name__=='__main__': anything() print('Called from the ScriptP1.') else: print('ScriptP1 is imported into another file.') 

انتاج:

 It is a function in the ScriptP1. Called from the ScriptP1. 

توضيح:

يتم تشغيل الدالة أي شيء () المحددة في البرنامج النصي ScriptP1 مباشرة باعتبارها البرنامج الرئيسي، كما هو موضح في الإخراج 'إنها وظيفة في البرنامج النصي ScriptP1.' متبوعًا بـ 'تم الاتصال من ScriptP1'. عندما يتم تشغيل البرنامج النصي مباشرة في بايثون، يتم تعيين المتغير __name__ إلى '__main__'؛ وبالتالي، يتم تقييم الشرط if __name__=='__main__' إلى True، ويتم استدعاء الدالة أي شيء (). تؤكد عبارة الطباعة التالية أن البرنامج النصي يتم تشغيله بشكل مباشر بالفعل.

الآن، لنقم بإنشاء ملف نصي جديد لـ Python باسم ScriptP2.py، ونقوم باستيراد ScriptP1.py إليه، ونحاول استدعاء الأسلوب ScriptP1 Anything().

شفرة : ال ScriptP2.py يتم توفير الرمز هنا:

 import ScriptP1 if __name__=='__main__': ScriptP1.anything() print('Called from the ScriptP2.') 

انتاج:

 ScriptP1 is imported into another file. It is a function in the ScriptP1. Called from the ScriptP2. 

توضيح:

يوضح البرنامج النصي Python المقدم كيفية استيراد وحدة 'ScriptP1' إلى البرنامج النصي النشط. الطريقة 'anything()' موجودة في 'ScriptP1'، ويتم استدعاؤها في البرنامج النصي الرئيسي. يتم استدعاء هذه الوظيفة، ويخرج البرنامج النصي 'تم الاتصال من ScriptP2.' للإشارة إلى اكتمال استدعاء الوظيفة. يشير تدفق الأحداث هذا إلى أنه تم الوصول إلى الوظيفة المحددة في 'ScriptP1' وتم تنفيذها بنجاح في سياق البرنامج النصي الذي يتم تشغيله الآن، والذي تم تعريفه باسم 'ScriptP2'.

عندما تم تشغيل عبارة الاستيراد لـ ScriptP1 داخل ScriptP2، كان للمتغير __name__ القيمة ScriptP1 (اسم الوحدة)؛ ولكن بما أن ScriptP2 كان أول برنامج نصي يتم تشغيله، فسوف يحمل الآن القيمة __main__.

طباعة قيمة __name__ :

لنطبع قيمة المتغير __name__ في كل مرحلة من مراحل التنفيذ لمساعدتك على فهمه بشكل أفضل.

مثال : يتم توفير الكود المصدري للبرنامج النصي ScriptP1.py Python أدناه:

 print('Value or the variable __name__ : ' + __name__) 

انتاج:

 Value or the variable __name__ : __main__ 

توضيح:

تقوم عينة كود Python التي تم توفيرها بإخراج قيمة المتغير __name__، والذي، عند تشغيل البرنامج النصي مباشرة، يتم تقييمه إلى 'رئيسي'. هذا يعني أنه عند تشغيل البرنامج النصي مباشرةً، سيتم تشغيل مقطع التعليمات البرمجية الذي يأتي بعد الشرط if __name__ == '__main__': بدلاً من استيراده كوحدة نمطية إلى برنامج نصي آخر. يتم استخدام هذا النوع من السلوك بشكل متكرر للتمييز بين تنفيذ البرنامج النصي كتطبيق أساسي واستيراده إلى برنامج نصي آخر كوحدة نمطية.

مثال 2 : وإليك الكود المصدري للبرنامج النصي ScriptP2.py:

طباعة نمط النجمة
 # importing the file ScriptP1.py import ScriptP1 print('Value or the variable __name__ : ' + __name__) 

انتاج:

 Value or the variable __name__ : __main__ 

توضيح:

يستخدم البرنامج النصي Python المقدم عبارة الاستيراد لاستيراد الملف 'ScriptP1.py'. عند تنفيذه، تتم طباعة 'main' كقيمة المتغير __name__. وهذا يعني أنه بدلاً من استيراده كوحدة نمطية إلى برنامج نصي آخر، يتم تنفيذ البرنامج النصي مباشرة باعتباره التطبيق الأساسي. عند تنفيذ نصوص بايثون، هذا هو السلوك المعتاد؛ ينعكس سياق تنفيذ البرنامج النصي في المتغير __name__.

ملخص :

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