متغیر __name__


#1

سلام. دوستان
من یک موضوع رو به طور کامل نتونستم درک کنم .

متغیر name چی هستش؟

بعضی موقعه این دستور رو میبینم

__name__ == __main__
امکانش هست توضیح مختصر همراه مثال ؟


#2


#3

سلام.
به جمع ما خوش‌اومدین.

این متغیر نیست. یک مقدار فرق میکنه قضیش.
فکر کنم اگه به صورت تجربی توضیح بدم واضحترین حالت باشه.

یه فایل بسازید به نام mylib.py و این کد رو داخلش بنویسید:

def myfunc():
    print('this is a text')

myfunc()

وقتی این کد رو اجرا کنید (python mylib.py) نتیجه‌ای که بهش فکر میکنید رو میگیرید. تابع اجرا میشه و متن پرینت میشه.

حالا اگه بخوایم این لایبرری رو توی یه فایل دیگه import کنیم، اونوقت همون لحظه‌ی import کد myfunc() اجرا میشه و تابع صدا زده میشه. ما اینو نمیخوایم.
تست کنید. یه فایل بسازید به نام main.py و داخلش اینو بنویسید:

import mylib

برای اینکه زمان import تابع اجرا نشه، باید خط آخر (در mylib.py) رو پاک کنیم. در این صورت، دیگه نمیتونیم اون فایل رو به صورت تکی صدا بزنیم. (python mylib.py)

برای اینکه این مشکل حل بشه، و هردوتا حالت رو داشته باشیم، باید کد ما، خودش بدونه که به صورت تکی اجرا شده یا توی یه کد دیگه import شده.
برای فهمیدن این موضوع میتونیم محتویات __name__ رو بخونیم. (این محتوا همیشه به صورت string هست)

اگه خط آخر کد mylib.py رو به این شکل تغییر بدیم:

if __name__ == "__main__":
    myfunc()

اونوقت فقط زمانی که فایل به صورت مستقل اجرا شده باشه، تابع صدا زده میشه.


پ.ن۱:
ما معمولا کدهامون رو توی چندتا فایل میذاریم که دسته بندی هر قسمت از پروژه مشخص باشه و به هم ریخته نباشه. مثلا یه مثال بزرگ بخوام بزنم، یه وبسایت. مسلما اگه بخوایم کدهای مربوط به صفحات پابلیک و صفحات پنل کاربری رو توی یه فایل پایتون بریزیم، حجم فایل زیاد میشه و پیدا کردن هر تابع سخت میشه. حالا اگه بخوایم فایلهای ارتباط با دیتابیس رو هم توی همون فایل داشته باشیم، خیلی پیچیده‌تر میشه. حالا تصور کنید یه سری توابع هم باید داشته باشیم برای رندر گرفتن html که قراره به کاربر بفرستیم. بهتره هرکدوم رو توی یه بخش جداگانه بذاریم که مدیریتش راحتتر باشه. به این میگن «معماری پروژه» (شاید اسم بهتری براش باشه. مطمئن نیستم

پ.ن۲:
داخل mylib.py این کد رو بنویسید (فقط لازمه یه خط تغییر کنه):

def myfunc():
    print('this is a text')
    print(__name__)

if __name__ == "__main__":
    myfunc()

وقتی با دستور python mylib.py اجراش کنید، این نتیجه رو میبینید:

─$ python mylib.py 
this is a text
__main__

و زمانی که از طریق main.py اجراش کنید (با دستور python main.py)، این نتیجه رو میبینید:

─$ python main.py 
this is a text
mylib

نتیجه:

زمانی که کد به صورت مستقیم اجرا بشه، محتویات __name__ برابر با استرینگ "__main__" هست.
زمانی که کد از داخل یه کد دیگه صدا زده بشه، محتویات __name__ برابر با اسم فایل هست.

پ.ن۳:
کد نهایی:


#4

خیلی ممنون بابت توضیح خوبتون.


#5

توضیح کامل داده شد
اما برای مطالعه بیشتر میتونید به این لینک مراجعه کنید
https://docs.python.org/3/tutorial/modules.html#executing-modules-as-scripts