حتماً با ساختار if __name__ == “main” در پایتون برخورد کرده اید. اما آیا هدف دقیق آن را می دانید؟
در برخی از زبان های برنامه نویسی، روش اصلی به عنوان تنها نقطه ورودی برای اجرای یک برنامه عمل می کند. هنگام انتقال از زبان های دیگر به پایتون، اصطلاح if __name__ == “__main__” ممکن است به نظر می رسد همان کار را انجام می دهد. در پایتون اینطور نیست.
اصطلاح if __name__ == “__main__” اجازه می دهد تا زمانی که فایل به صورت اسکریپت اجرا می شود، کد خاصی اجرا شود. همچنین اطمینان حاصل می کند که هنگام وارد کردن فایل به عنوان یک ماژول، همان کد اجرا نمی شود.
درک رفتار متغیر __name__
متغیر __name__ در پایتون تعبیه شده است. این نشان دهنده نام ماژول یا اسکریپتی است که در آن استفاده شده است. هنگامی که یک اسکریپت به عنوان برنامه اصلی اجرا می شود، مقدار آن روی __main__ تنظیم می شود. اگر اسکریپت را به عنوان یک ماژول وارد کنید، مقدار متغیر به نام واقعی ماژول تنظیم می شود.
این ممکن است در ابتدا گیج کننده باشد، اما به مثال زیر توجه کنید:
یک اسکریپت ایجاد کنید و نام آن را greetings.py بگذارید. این اسکریپت حاوی تابعی است که به کاربر خوش آمد می گوید و مقدار متغیر __name__ را چاپ می کند. همچنین از کاربر می خواهد که نام خود را وارد کند.
def greet(name):
print(f"Hello, {name}!")
print("Value of __name__:", __name__)
if __name__ == "__main__":
user_name = input("Please enter your name: ")
greet(user_name)
else:
print("The module 'greetings' has been imported.")
با اجرای اسکریپت greetings.py خروجی زیر نمایش داده می شود:
مقدار متغیر __name__ به صورت __main__ برمی گردد زیرا اسکریپت مستقیما اجرا می شود.
حالا یک اسکریپت دیگر بسازید و نام آن را script2.py بگذارید. سپس، اسکریپت تبریک را به عنوان یک ماژول وارد کنید.
import greetings
print("Executing the greetings script...")
greetings.greet("Alice")
فراخوانی تابع greet از ماژول احوالپرسی خروجی زیر را به دست می دهد.
مقدار متغیر __name__ به نام واقعی ماژول وارد شده تغییر می کند. در این صورت سلام.
این مقدار همان چیزی است که اصطلاح اگر __name__ == “__main__” به دنبال آن است تا تعیین کند که آیا یک فایل به عنوان یک اسکریپت اجرا می شود یا به عنوان یک ماژول وارد شده است.
چه زمانی از ساختار if __name__ == “__main__” استفاده کنیم؟
می توانید ساختار if __name__ == “__main__” را در هر اسکریپتی اضافه کنید. اما سناریوهایی وجود دارد که استفاده از آن می تواند بیشترین سود را داشته باشد. با استفاده از برنامه ماشین حساب ساده زیر با این سناریوها آشنا خواهید شد.
# calculator.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b != 0:
return a / b
else:
return "Error: Division by zero!"
if __name__ == "__main__":
print("Welcome to the Calculator!")
print("Select an operation:")
print("1. Add")
print("2. Subtract")
print("3. Multiply")
print("4. Divide")
choice = int(input("Enter your choice (1-4): "))
num1 = float(input("Enter the first number: "))
num2 = float(input("Enter the second number: "))
if choice == 1:
result = add(num1, num2)
print(f"The sum of {num1} and {num2} is: {result}")
elif choice == 2:
result = subtract(num1, num2)
print(f"The difference between {num1} and {num2} is: {result}")
elif choice == 3:
result = multiply(num1, num2)
print(f"The product of {num1} and {num2} is: {result}")
elif choice == 4:
result = divide(num1, num2)
print(f"The division of {num1} by {num2} is: {result}")
else:
print("Invalid choice!")
اولین سناریو زمانی است که می خواهید یک اسکریپت را به طور مستقل اجرا کنید و اقدامات خاصی را انجام دهید. این به اسکریپت اجازه می دهد تا به عنوان یک برنامه مستقل عمل کند. ساختار if __name__ == “__main__” به کاربران اجازه می دهد تا با استفاده از رابط خط فرمان با ماشین حساب تعامل داشته باشند. این به کاربران این امکان را می دهد که از عملکرد برنامه بدون نیاز به درک یا تغییر کد اصلی استفاده کنند.
همچنان می توان برنامه را بدون ساختار if __name__ == “__main__” اجرا کرد و به همان نتیجه رسید، اما کد شما سازماندهی کد مدولار را از دست می دهد.
سناریوی دوم زمانی است که می خواهید کد شما یک طراحی ماژولار داشته باشد. این به برنامه های دیگر اجازه می دهد تا اسکریپت شما را به عنوان یک ماژول وارد کنند و از توابع آن بدون ایجاد قابلیت های غیر ضروری استفاده کنند.
در مورد برنامه ماشین حساب، برنامه های دیگر می توانند ماژول ماشین حساب را بدون فعال کردن رابط CLI و اعلان های ورودی کاربر وارد کنند. این قابلیت استفاده مجدد کد و طراحی مدولار را تضمین می کند. از این رو، ماشین حساب را قادر می سازد تا به طور یکپارچه در برنامه های بزرگتر یکپارچه شود.
import calculator
# Using the functions from the calculator module
result_add = calculator.add(5, 3)
print("Addition result:", result_add)
result_subtract = calculator.subtract(10, 4)
print("Subtraction result:", result_subtract)
سناریوی سوم زمانی است که می خواهید اسکریپت پایتون خود را مستقل از هر ماژول یا اسکریپت دیگری که ممکن است آن را وارد کند، آزمایش و اشکال زدایی کنید. در مثال ماشین حساب، تمرکز بر روی آزمایش عملکرد ماشین حساب بدون تداخل کد خارجی را آسان تر می کند.
import calculator
# Testing the calculator functions
if __name__ == "__main__":
# Test addition
result = calculator.add(5, 3)
print("Addition Result:", result)
# Test subtraction
result = calculator.subtract(8, 4)
print("Subtraction Result:", result)
# Test multiplication
result = calculator.multiply(2, 6)
print("Multiplication Result:", result)
کد بالا نحوه اشکال زدایی اسکریپت ماشین حساب را به طور مستقل نشان می دهد.
چه زمانی استفاده از ساختار if __name__ == “__main__” ضروری نیست؟
همانطور که در سناریوهای بالا مشاهده کردید، استفاده از ساختار if __name__ == “__main__” برای متمایز کردن اسکریپتی است که به عنوان برنامه اصلی اجرا می کنید و اسکریپتی که به عنوان ماژول وارد می کنید. با این حال مواردی وجود دارد که استفاده از آن غیر ضروری است.
حالت اول زمانی است که اسکریپت شما ساده است و هیچ توابع یا ماژول قابل استفاده مجددی ندارد و قصد واردات آن را ندارید. در این مورد، باید این ساختار را حذف کنید زیرا کل اسکریپت در هنگام اجرا اجرا می شود. این امر برای اسکریپت های یکبار مصرف که هدف خاصی را انجام می دهند و برای استفاده مجدد یا وارد کردن در نظر گرفته نشده اند رایج است.
مورد دیگر زمانی است که شما در یک جلسه تعاملی پایتون کار می کنید، به عنوان مثال. هنگام استفاده از نوت بوک Jupyter. در یک جلسه تعاملی، شما کد را مستقیماً در خط فرمان یا در یک پوسته تعاملی پایتون تایپ و اجرا می کنید. مانند Python REPL (Read-Eval-Print Loop). این به شما امکان می دهد تا با کد آزمایش کنید و قطعات کوچک را آزمایش کنید و نتایج فوری به شما ارائه می دهد.
در این محیط های تعاملی، مفهوم اسکریپت در حال اجرا به عنوان برنامه اصلی یا وارد شده به عنوان یک ماژول کاربرد ندارد. شما به طور مستقیم قطعات کد را بدون نیاز به نقطه ورودی اسکریپت سنتی اجرا می کنید.
چگونه در پایتون استاد شوید؟
برای استاد شدن در هر زبان برنامه نویسی، باید درک کنید که مفاهیم زیربنایی توابع یا ابزارها چگونه کار می کنند. درست همانطور که در این مقاله در مورد ساختار if __name__ == “__main__” یاد گرفتید.
درک مفاهیم زیربنایی به شما کمک می کند تا دقیقاً بدانید برنامه شما در هنگام استفاده از آنها چگونه رفتار خواهد کرد. عجله ای وجود ندارد، یادگیری مفاهیم یک به یک به شما کمک می کند عمیق تر در هر یک از آنها شیرجه بزنید.