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

سرور مجازی NVMe

اگر __name__ == “__main__”: در پایتون انجام دهید، چه می‌شود؟

0 10
زمان لازم برای مطالعه: 4 دقیقه


معرفی

دیدن آن معمول است if __name__ == "__main__" در اسکریپت های پایتون که به صورت آنلاین پیدا می کنیم، یا یکی از بسیاری از اسکریپت هایی که خودمان می نویسیم.

چرا هنگام اجرای برنامه‌های پایتون از آن عبارت if استفاده می‌کنیم؟ در این مقاله، مکانیک استفاده از آن، مزایا و مکان هایی که می توان از آن استفاده کرد را توضیح می دهیم.

ویژگی __name__ و محدوده __اصلی__

این __name__ ویژگی به طور پیش‌فرض به عنوان یکی از نام‌ها در محلی فعلی می‌آید محدوده. مفسر پایتون زمانی که ما یک اسکریپت پایتون را اجرا می کنیم یا کد خود را به عنوان یک ماژول وارد می کنیم، به طور خودکار این مقدار را اضافه می کند.

دستور زیر را امتحان کنید روی مفسر پایتون شما ممکن است متوجه شوید __name__ متعلق به لیست صفات در dir():

dir()

خروجی dir()

این __name__ در پایتون یک متغیر ویژه است که نام کلاس یا ماژول فعلی یا اسکریپتی که از آن فراخوانی می شود را تعریف می کند.

یک پوشه جدید به نام ایجاد کنید name_scripts بنابراین ما می توانیم چند اسکریپت بنویسیم تا بفهمیم این همه چگونه کار می کند. در آن پوشه یک فایل جدید ایجاد کنید، script1.py با کد زیر:

print(f'The __name__ from script1 is "{__name__}"')

اسکریپت 1.py خروجی

این یک توپ منحنی است! ما انتظار داریم که این نام باشد script1، به عنوان پرونده ما. چه خروجی __main__ منظور داشتن؟

به طور پیش فرض، هنگامی که یک اسکریپت اجرا می شود، مفسر اسکریپت را می خواند و رشته را اختصاص می دهد. __main__ به __name__ کلمه کلیدی.

وقتی اسکریپت فوق به اسکریپت دیگری وارد می شود جالب تر می شود. یک فایل پایتون به نام را در نظر بگیرید script2.py با کد زیر:

import script1  

print(f'The __name__ from script2 is "{__name__}"')

اسکریپت 2.py خروجی

همانطور که می بینید، زمانی که اسکریپت اجرا می شود، خروجی به صورت داده می شود 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 فراخوانی می شود:

اسکریپت 3.py خروجی

همانطور که اسکریپت به طور مستقیم اجرا شد، __name__ کلمه کلیدی به آن اختصاص داده شده است __main__و بلوک کد زیر if __name__ == "__main__" شرط اجرا می شود.

ب) وقتی این قطعه از آن وارد می شود چه اتفاقی می افتد script4.py:

import script3

print(f"{script3.__name__}")

اسکریپت 4.py خروجی

بلوک زیر 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

اسکریپت 1.py خروجی

این ساختار همچنین ظاهر تمیزتری به مکان فضای کاری، روش سازماندهی دایرکتوری ها و نقطه ورودی در داخل یک فایل جداگانه به نام تعریف می کند. __main__.py.

نتیجه

این __name__ == "__main__" بلوک های کد را فقط زمانی اجرا می کند که اسکریپت پایتون ما مستقیماً از یک کاربر اجرا شود. این قدرتمند است زیرا به کد ما اجازه می دهد تا زمانی که به عنوان یک برنامه اجرا می شود به جای اینکه به عنوان یک ماژول وارد شود، رفتار متفاوتی داشته باشد.

هنگام نوشتن ماژول‌های بزرگ، می‌توانیم رویکرد ساختاریافته‌تری برای داشتن a را انتخاب کنیم __main__.py فایل برای اجرای یک ماژول. برای یک اسکریپت مستقل، از جمله if __name__ == "__main__" روش ساده تری برای جداسازی API از برنامه است.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-15 09:40:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید