ویدیو آشنایی با if name == main در پایتون

امیرحسین بیگدلو July 2023

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

 

زمانی که شما یک کد پایتونی رو اجرا میکنید، پایتون میاد چندتا special variable رو ایجاد میکنه و یه سری اطلاعات رو داخل اونها ذخیره میکنه. یکی از این متغیرهای خاص __name__ هستش.

 

به طور کلی __name__ دو تا مقدار میگیره:

1. اگه شما یک ماژول رو به صورت مستقیم run کنید مقدار __main__ رو میگیره.

2. و اگه جای دیگه import کرده باشیدش اسم اون ماژول رو میگیره.

 

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

print(__name__)

 

اگه این فایل رو اجرا کنید مقدار زیر رو به شما نشون میده:

__main__

دیدید که چون فایل رو به صورت مستقیم run کردیم این مقدار رو به ما نشون داد.

 

حالا یه فایل دیگه میسازم به اسم second.py و ماژول first.py رو import میکنم:

import first

 

الآن اگه شما ماژول second رو صدا بزنید این نتیجه رو میبینید:

first

دقت کنید که دستور print داخل ماژول first اجرا شد.

 

خب حالا فهمیدید که __name__ چه طوری کار میکنه.

 

و میرسیم سر اصل مطلب:

if __name__ == "__main__"

این جمله مشخص میکنه که آیا یک ماژول داره به صورت مستقیم run میشه یا جایی دیگه import شده.

 

کد زیر رو داخل ماژول first مینویسم:

def show():
     print('Hello...')

if __name__ == "__main__":
     show()

یه فانکشن ساده داریم که Hello رو چاپ میکنه. و داخل شرط if هم اون فانکشن رو صدا زدیم.

 

الآن اگه شما ماژول first رو اجرا کنید Hello چاپ میشه.

 

اما اگه ماژول second رو اجرا کنید چیزی چاپ نمیشه.(فقط دقت کنید که توی ماژول second ماژول first رو import کرده باشین). چی شد؟

 

زمانی که ماژول first رو صدا زدید __name__ مقدار __main__ رو گرفت و فانکشن show اجرا شد اما زمانی که ماژول second رو صدا زدید __name__ مقدار first رو گرفت و فانکشن دیگه اجرا نشد.

اگر ویدیو بالا را دوست داشتید پیشنهاد میکنیم به مطالب زیر هم سر بزنید:

آموزش عملگر walrus در پایتون

آموزش ماژول pdb در پایتون

چقدر زمان میبرد تا پایتون را یاد بگیریم؟

آموزش برنامه‌نویسی شی گرا در پایتون

ویدیو آموزش function در پایتون

دوره آموزش Design Patterns در پایتون

ویدیوهای مشابه



ارسال نظر


رضا

3 ماه قبل پاسخ به نظر

مرسی، عالی بود

ارسال نظر



علی

3 ماه قبل پاسخ به نظر

ممنون امیرحسین جان

ارسال نظر



Kourosh

1 سال قبل پاسخ به نظر

سلام
امیدوارم که حالتون عالی باشه
واقعا یکی از کامل ترین، با کیفیت ترین و بی نظیر ترین آموزگار های پایتون هستید و من به شخصه خیلی چیز ها از شما یاد گرفتم

کار ام رو خیلی راحت کردید و هر چیزی که نیاز داشتم رو توی آموزش ها و دوره هاتون گفته بودید
خدقوت میگم بهتون
ممنونم واقعا

ارسال نظر



مالک جهان آبادی

1 سال قبل پاسخ به نظر

مرسی استاد

ارسال نظر



حاتمیان

1 سال قبل پاسخ به نظر

واقعا ازتون ممنونم شاید 20 تا ویدیو دیدم هیچ کدوم واضح نبود توضیح شون.موفق باشید

ارسال نظر



محمدرضا

2 سال قبل پاسخ به نظر

دمت گرم بابت اینهمه ویدئوی خوب.یکی از بهترین مراجع پایتون

ارسال نظر



سیامک

2 سال قبل پاسخ به نظر

سلام استاد
این روشی که گفتید فقط اسم ماژول رو به ما میده، اگر بخواهیم اسم پکیج رو داشته باشیم چی باید بنویسیم ؟ یا اگر بخواهیم کل مسیر رو داشته باشیم چی باید بنویسیم ؟ مثلا پکیج فلان ماژول فلان و ...

ارسال نظر



امیرحسین بیگدلو

2 سال قبل

سلام
print(__file__)


سیامک

2 سال قبل

سلام استاد
روشی که گفتید رو امتحان کردم (__file__)، فقط اسم فایل رو بهمون میده
اسم پکیج رو نمیده ، برای پگیج راهی وجود داره ؟


امیرحسین بیگدلو

2 سال قبل

سلام
اسم فایل رو نمیده، کل مسیر رو میده.
منظورت از پکیج چیه؟
یه مثال بزن من بفهمم


سیامک

2 سال قبل

سلام
استاد روشی که گفتید __file__ فقط اسم اون فایلی رو میده که ما داریم run می کنیم ، منظورم از پکیج اسم فولدر هست
مثلا یه فولدر میسازیم به اسم A و سپس(init__.py__) توی فولدر A می سازیم که البته شما فرمودین تو ورژن های جدیدتر نیازی به فایل (init__.py__) نیست برای ساخت پکیج پایتونی و بعد توی همون فولدر مثلا یه فایل می سازیم test.py

حالا اگر تو test.py ، اینو پرینت بگیریم (__fil__) , فقط برامون test.py را چاپ می کنه و دیگه اسم اون فولدر رو که A هست چاپ نمیکنه ، منظورم از اسم پکیج هم همون A هست
مگه به اونA اسم پکیج نمیگن ؟


امیرحسین بیگدلو

2 سال قبل

آهان. اینو بزن ببین کارت راه میوفته:
from pathlib import Path

x= Path(__file__).parent

print(x)


امیرحسین بیگدلو

2 سال قبل

بالایی کل دایرکتوری رو میاورد. این فقط اسم دایرکتوری پدر:
import os
x = os.path.basename(os.path.dirname(__file__))
print(x)


سیامک

2 سال قبل

هر دو تارو امتحان کردم
هیچکدوم کار نکرد
اولی فقط یه نقطه چاپ میکنه
دومی هم چیزی چاپ نمیکنه ( استرینگ خالی هست )


امیرحسین بیگدلو

2 سال قبل

:/
اینا رو چه جوری اجرا میکنی؟

ali

2 سال قبل پاسخ به نظر

ببخشید یه سوا تو فایل secend اگه print(f'__name__ => {__name__}')
بنویسم main رو چاپ میکنه دوباره چرا؟

ارسال نظر



arman

2 سال قبل پاسخ به نظر

ممنون از شما ، خیلی کمک کرد بهم.

ارسال نظر



Elaheh

2 سال قبل پاسخ به نظر

کاش کل پایتون را میشد این جوری یاد گرفت . مثل اب خوردن میشد والا
مرسی

ارسال نظر



فرامرز

2 سال قبل پاسخ به نظر

ممنون از آموزش ها
فقط متوجه نشدم چرا import کردید اجرا شد؟ مگر بعد از import نباید یک تابع را call کنیم تا اجرا بشه؟!!!

ارسال نظر



امیرحسین بیگدلو

2 سال قبل

چی اجرا شد؟ بعد ایمپورت چیزی اجرا نشد که

As

3 سال قبل پاسخ به نظر

همه جا این توضیحه هست

ارسال نظر



nima s

3 سال قبل پاسخ به نظر

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

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

نظر لطف شماست

hajar

3 سال قبل پاسخ به نظر

خیلی خوب بود ممنون

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

خواهش میشه

مونگارد