از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
اگر __name__ == “__main__”: در پایتون انجام دهید، چه میشود؟
سرفصلهای مطلب
معرفی
دیدن آن معمول است if __name__ == "__main__"
در اسکریپت های پایتون که به صورت آنلاین پیدا می کنیم، یا یکی از بسیاری از اسکریپت هایی که خودمان می نویسیم.
چرا هنگام اجرای برنامههای پایتون از آن عبارت if استفاده میکنیم؟ در این مقاله، مکانیک استفاده از آن، مزایا و مکان هایی که می توان از آن استفاده کرد را توضیح می دهیم.
ویژگی __name__ و محدوده __اصلی__
این __name__
ویژگی به طور پیشفرض به عنوان یکی از نامها در محلی فعلی میآید محدوده. مفسر پایتون زمانی که ما یک اسکریپت پایتون را اجرا می کنیم یا کد خود را به عنوان یک ماژول وارد می کنیم، به طور خودکار این مقدار را اضافه می کند.
دستور زیر را امتحان کنید روی مفسر پایتون شما ممکن است متوجه شوید __name__
متعلق به لیست صفات در dir()
:
dir()
این __name__
در پایتون یک متغیر ویژه است که نام کلاس یا ماژول فعلی یا اسکریپتی که از آن فراخوانی می شود را تعریف می کند.
یک پوشه جدید به نام ایجاد کنید name_scripts
بنابراین ما می توانیم چند اسکریپت بنویسیم تا بفهمیم این همه چگونه کار می کند. در آن پوشه یک فایل جدید ایجاد کنید، script1.py
با کد زیر:
print(f'The __name__ from script1 is "{__name__}"')
این یک توپ منحنی است! ما انتظار داریم که این نام باشد script1
، به عنوان پرونده ما. چه خروجی __main__
منظور داشتن؟
به طور پیش فرض، هنگامی که یک اسکریپت اجرا می شود، مفسر اسکریپت را می خواند و رشته را اختصاص می دهد. __main__
به __name__
کلمه کلیدی.
وقتی اسکریپت فوق به اسکریپت دیگری وارد می شود جالب تر می شود. یک فایل پایتون به نام را در نظر بگیرید script2.py
با کد زیر:
import script1
print(f'The __name__ from script2 is "{__name__}"')
همانطور که می بینید، زمانی که اسکریپت اجرا می شود، خروجی به صورت داده می شود script1
نشان دهنده نام فیلمنامه است. آخرین print بیانیه در محدوده script2
و هنگامی که اجرا می شود، خروجی به صورت زیر چاپ می شود: __main__
.
اکنون که میدانیم پایتون چگونه از آن استفاده میکند __name__
scope و زمانی که به آن مقدار “__main__” می دهد، بیایید ببینیم که چرا قبل از اجرای کد، مقدار آن را بررسی می کنیم.
اگر __name__ == “__main__” در Action
ما از if-state برای اجرای بلوک های کد استفاده می کنیم فقط اگر برنامه ما برنامه اصلی اجرا شده باشد. این اجازه می دهد تا برنامه ما به تنهایی قابل اجرا باشد، اما برای سایر ماژول های پایتون که ممکن است بخواهند سازگار باشد import برخی از عملکردها بدون نیاز به اجرای کد.
برنامه های پایتون زیر را در نظر بگیرید:
آ) script3.py
حاوی تابعی به نام add()
که فقط از متن اصلی فراخوانی می شود.
def add(a, b):
return a+b
if __name__ == "__main__":
print(add(2, 3))
در اینجا خروجی زمانی است script3.py
فراخوانی می شود:
همانطور که اسکریپت به طور مستقیم اجرا شد، __name__
کلمه کلیدی به آن اختصاص داده شده است __main__
و بلوک کد زیر if __name__ == "__main__"
شرط اجرا می شود.
ب) وقتی این قطعه از آن وارد می شود چه اتفاقی می افتد script4.py
:
import script3
print(f"{script3.__name__}")
بلوک زیر if __name__ == "__main__"
از جانب script3.py
همانطور که انتظار می رفت اجرا نشد. این اتفاق افتاد زیرا __name__
کلمه کلیدی اکنون به نام اسکریپت اختصاص داده شده است: script3
. این را می توان تأیید کرد print بیانیه داده شده که مقدار تخصیص داده شده را چاپ می کند __name__
کلمه کلیدی.
__name__ == “__main__” چگونه به توسعه کمک می کند؟
در اینجا چند مورد استفاده برای استفاده از آن عبارت if در هنگام ایجاد اسکریپت آورده شده است
- تست کردن یک تمرین خوب است که نه تنها به شناسایی اشکالات کمک می کند، بلکه اطمینان حاصل می کند که کد شما مطابق نیاز رفتار می کند. فایل های تست باید import یک تابع یا شی به آنها. در این موارد، ما معمولاً نمی خواهیم اسکریپت به عنوان ماژول اصلی اجرا شود.
- شما در حال ایجاد یک کتابخانه هستید، اما می خواهید یک نسخه نمایشی یا سایر موارد ویژه زمان اجرا را برای کاربران قرار دهید. با استفاده از این عبارت if، ماژول های پایتون که از کد شما به عنوان کتابخانه استفاده می کنند، تحت تأثیر قرار نمی گیرند.
ایجاد __اصلی__.py فایل برای ماژول ها
نکته داشتن if __name__ == "__main__"
بلوک دریافت قطعه کد تحت شرایطی است که زمانی که اسکریپت در آن است اجرا شود __main__
محدوده. با این حال، هنگام ایجاد بستهها در پایتون، بهتر است که کد زیر آن اجرا شود __main__
متن در یک فایل جداگانه نوشته شده است.
بیایید مثال زیر را در نظر بگیریم – بسته ای برای انجام محاسبات. ساختار درخت فایل برای چنین سناریویی را می توان به صورت زیر تجسم کرد:
calc
├── __main__.py
├── script1.py
├── script2.py
├── script3.py
├── script4.py
└── src
├── add.py
└── sub.py
ساختار درختی شامل calc
به عنوان root دایرکتوری و زیر شاخه ای که به نام src
. این __main__.py
زیر calc
دایرکتوری حاوی محتوای زیر است:
from src.add import add
from src.sub import sub
a, b = input("Enter two numbers separated by commas: ").split(',')
a, b = int(a), int(b)
print(f"The sum is: {add(a, b)}")
print(f"The difference is: {sub(a, b)}")
این add.py
شامل:
def add(a, b):
return a+b
و sub.py
شامل:
def sub(a, b):
return a-b
درست از بیرون calc
دایرکتوری، اسکریپت را می توان اجرا کرد و منطق داخل آن __main__.py
با فراخوانی اجرا می شود:
python3 calc
این ساختار همچنین ظاهر تمیزتری به مکان فضای کاری، روش سازماندهی دایرکتوری ها و نقطه ورودی در داخل یک فایل جداگانه به نام تعریف می کند. __main__.py
.
نتیجه
این __name__ == "__main__"
بلوک های کد را فقط زمانی اجرا می کند که اسکریپت پایتون ما مستقیماً از یک کاربر اجرا شود. این قدرتمند است زیرا به کد ما اجازه می دهد تا زمانی که به عنوان یک برنامه اجرا می شود به جای اینکه به عنوان یک ماژول وارد شود، رفتار متفاوتی داشته باشد.
هنگام نوشتن ماژولهای بزرگ، میتوانیم رویکرد ساختاریافتهتری برای داشتن a را انتخاب کنیم __main__.py
فایل برای اجرای یک ماژول. برای یک اسکریپت مستقل، از جمله if __name__ == "__main__"
روش ساده تری برای جداسازی API از برنامه است.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-15 09:40:04