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

August 2019

دانلود ویدیو

اگر دانلود ویدیو شروع نشد، روی ویدیو راست کلیک کرده و گزینه Save Video As را انتخاب کنید.

در پایتون امکان این وجود دارد که بتوانیم یه 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 در پایتون

ارسال نظر

تلاش میکنم سوالات شما را در کمتر از یک روز پاسخ بدم

حاتمیان

July 2022

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

پاسخ به نظر


محمدرضا

October 2021

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

پاسخ به نظر


سیامک

October 2021

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

پاسخ به نظر


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

October 2021

سلام
print(__file__)


سیامک

October 2021

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


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

October 2021

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


سیامک

October 2021

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

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


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

October 2021

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

x= Path(__file__).parent

print(x)


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

October 2021

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


سیامک

October 2021

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


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

October 2021

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

ali

July 2021

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

پاسخ به نظر


arman

July 2021

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

پاسخ به نظر


Elaheh

May 2021

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

پاسخ به نظر


فرامرز

March 2021

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

پاسخ به نظر


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

March 2021

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

As

January 2021

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

پاسخ به نظر


nima s

August 2020

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

پاسخ به نظر


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

August 2020

نظر لطف شماست

hajar

May 2020

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

پاسخ به نظر


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

May 2020

خواهش میشه