لماذا هناك حاجة إلى __init__.py ، وربما يعرف أي من الثعابين ، ولكن ماذا عن __main__.py ؟ لقد رأيت العديد من المشاريع ، سواء كانت تعمل أو في جيثب ، لا تستخدم هذا الملف السحري ، على الرغم من أنها يمكن أن تجعل حياتهم أسهل. في رأيي ، __main__.py هو أفضل طريقة للتفاعل مع الوحدات النمطية Python التي تتكون من عدة ملفات.
لكن ، دعنا نصلح أولاً: كيف يدير معظم الناس نصوص بيثون الخاصة بهم؟
بمجرد كتابة البرنامج الذي تريد استخدامه كوحدة نمطية مستوردة وكأداة تم إطلاقها من سطر الأوامر. على الأرجح تعرف ما الذي يتم عادةً في هذه الحالة:
if __name__ == '__main__': main(sys.argv)
عندما تغذي النص البرمجي للمترجم ، يحصل المتغير السحري العمومي __name__ على القيمة __main__ . وبالتالي ، فإننا نتعلم أن هذا ليس استيرادًا ، ولكنه إطلاق. على سبيل المثال:
python myapp.py
وهذا يعمل بشكل رائع لملف واحد.
المشكلة
ولكن إذا كنت مثلي ، فلن ترغب في أن يكون تطبيقك بالكامل في ملف واحد. تقسيم المنطق في ملفات مختلفة يبسط التحرير والدعم. على سبيل المثال:
. ├── README.me ├── requirements.txt ├── setup.py └── src ├── __init__.py ├── client.py ├── logic.py ├── models.py └── run.py
لكن المستخدم الذي قام باستنساخ المشروع من المستودع لن يفهم - أي من هذه الملفات هو الملف الرئيسي؟ هو run.py حقا؟ أو ربما client.py ؟ أين تبحث عن السلسلة المألوفة إذا __name__ == '__main__' ؟ هذا هو المكان الذي __main__.py قادر على إثبات نفسه.
__main__.py
يتم استدعاء ملف __main__.py عند بدء تشغيل المشروع بعلامة الوحدة النمطية - m . وهذا مناسب جدًا إذا كان الرمز مخصصًا للاستخدام كوحدة نمطية وللتشغيل من وحدة التحكم. فكر في هذا الملف كمكان لوضع كل ما تضعه عادةً في الداخل إذا __name__ == ' __main__' . دعنا نغير المشروع من المثال أعلاه وفقًا لذلك:
. ├── README.me ├── requirements.txt ├── setup.py └── myapp ├── __init__.py ├── __main__.py ├── client.py ├── logic.py ├── models.py
وفويلا! الآن يمكنك ببساطة بدء المشروع كوحدة نمطية.
python -m myapp
سيتم تنفيذ __main__.py تلقائيًا. هذا هو المكان المثالي لاستضافة واجهة سطر الأوامر والتعامل مع وسائط الإدخال!