عبارت __name__ را بخوانید: داندر name داندر
عبارت __main__ را بخوانید: داندر main داندر
برای درک کاربرد این شرط در پایتون قدم به قدم با مثال توضیح می دهم:
ابتدا یک فایل m1.py ایجاد میکنیم و یک تابع می نویسیم که دو عدد ورودی میگیرد و جمع آن دو را بعنوان خروجی چاپ می کند
def sum(a,b):
print(__name__) این خط برای درک بهتر
print(a+b)
sum(2,3)
فایل پایتون m1 را اجرا می کنیم
python m1.py
>> __main__
>>5
همانطور که مشاهده میکنیم خروجی __name__ در این حالت که به طور مستقیم اجرا می کنیم __main__ خواهد بود. در مورد نحوه اجرا به صورت غیر مستقیم جلوتر توضیح میدم و تفاوتش را می بینیم.
حالا دستورات را به صورت زیر تکمیل می کنیم و اجرا میکنیم:
def add(a,b):
print(__name__)
print(a+b)
if __name__ == "__main__":
print(add(2,3))
در این حالت چون فایل m1 را مستقیم اجرا می کنیم بنابراین شرط برقرار خواهد شد چون __name__ برابر __main__ است و خروجی ۵ چاپ می شود
حالا یک فایل دیگر به نام project.py درست می کنیم و کنار فایل m1 ذخیره میکینم تا فایل m1 را به صورت ماژول یعنی به صورت غیر مستقیم صدا کنیم تا تفاوت را ببینیم به اینصورت داخل فایل project می نویسیم
import m1
فایل project را اجرا میکنیم
python project.py
خروجی می شود فقط
>> m1
یعنی اینبار مقدار __name__ برابر m1 میشود چون دیگر به صورت مستقیم m1.py را اجرا نکردیم بنابراین شرط زیر داخل m1 برقرار نیست و کدهای داخلش اجرا نمی شوند
if __name__ == "__main__":
print(add(2,3))
پس در حالت دوم شرط بالا برقرار نمیشود و خروجی ۵ چاپ نمی شود.
حالا کاربردش:
عملا این شرط هنگام ماژول نوشتن مثل یک حصاری دور کدهامون می باشد که فقط وقتی فایل یا ماژول را به صورت مستقیم اجرا می کنیم تمام کدها اجرا می شوند چه داخل شرط و چه خارج شرط ولی اگر به صورت غیرمستقیم آن را بعنوان ماژول استفاده کنیم دیگر کدهای داخل بلاک شرط اجرا نمی شوند و دسترسی نداریم و فقط به متدها و دستورات خارج از آن شرط دسترسی خواهیم داشت چون دیگه __name__ مساوی __main__ نیست و برابر با نام فایل ماژول می شود. و درستش هم همینه وقتی ما می خواهیم از یک ماژولی که خودمان یا برنامه نویس دیگر نوشته استفاده کنیم صرفا باید به توابع و کلاسهاش دسترسی داشته باشیم تا بتوانیم دوباره استفاده کنیم نه دستوراتی که مثلا برای تست آن توابع نوشته شده و عملا موقع import در خروجی چیز اضافه ای چاپ نشود.
حالا دستور زیر را به فایل project.py اضافه می کنیم
import m1
m1.add(6,4)
خروجی می شود
>>m1
>>10
و در آخر برای اینکه فقط حاصل جمع چاپ شود یعنی m1 جاپ نشود دستور زیر را در فایل m1 حذف یا کامنت می کنیم چون این خط جهت درک بهتر نوشته شده بود
# print(__name__)