মূলঃ Python if __name__ == __main__ Explained with Code Examples, লেখকঃ Goran Aviani

পাইথন ইন্টারপ্রেটার যখন একটি পাইথন ফাইল পড়ে তখন ইন্টারপ্রেটারটি শুরুতেই কিছু বিশেষ ভ্যারিয়েবল সেট করে নেয়। এরপর ইন্টারপ্রেটারটি ফাইল থেকে কোডটি এক্সিকিউট করে।

এই বিশেষ ভ্যারিয়েবলগুলির একটি হল __name__

আপনি যদি এই আর্টিকেলটিকে ধাপে ধাপে অনুসরণ করেন এবং কোড স্নিপেটগুলি পড়েন, তাহলে আপনি if __name__ == "__main__" এর ব্যবহার এবং গুরুত্ব বুঝতে পারবেন।

পাইথন মডিউলের ব্যাখ্যা

পাইথন ফাইলগুলিকে মডিউল বলা হয় এবং এগুলির ফাইল এক্সটেনশন হিসেবে .py ব্যবহার করা হয়। একটি মডিউলে ফাংশন, ক্লাস, এবং ভ্যারিয়েবল থাকতে পারে।

সুতরাং ইন্টারপ্রেটারটি যখন একটি মডিউল চালায় তখন যে মডিউলটিকে চালানো হচ্ছে সেটি যদি মেইন প্রোগ্রাম হয় তাহলে __name__ ভ্যারিয়েবলটির মান হিসেবে __main__ সেট হয়।

কিন্তু মডিউলটিকে অন্য ফাইল থেকে ইম্পোর্ট করা হলে __name__ ভ্যারিয়েবলটির মান হিসেবে ঐ মডিউলের নাম সেট হবে।

একটি উদাহরণ দেখা যাক। প্রথমে file_one.py নামের একটি নতুন ফাইল তৈরি করুন এবং সেই ফাইলে নিম্নোক্ত টপ লেভেল কোডটি কপি-পেস্ট করুনঃ

# Python file one module

print("File one __name__ is set to: {}" .format(__name__))
file_one.py

এই কোডটি চালালেই আপনি আমাদের পুর্ববর্তী আলোচনা বুঝতে পারবেন। এই মডিউলের জন্য __name__ ভ্যারিয়েবলটির মান __main__ হবেঃ

File one __name__ is set to: __main__


এখন file_two.py নামে আরেকটি ফাইল তৈরি করুন এবং সেখানে নিম্নোক্ত কোড কপি-পেস্ট করুনঃ

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))
file_two.py

এবার file_one.py এর কোড পরিবর্তন করুন যেন আমরা file_two মডিউলটি ইম্পোর্ট করিঃ

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))
file_one.py

file_one এর কোডটি চালালে আমরা দেখবো যে এই ফাইলের জন্য __name__ ভ্যারিয়েবলের মান এখনো __main__ আছে কিন্তু file_two এর __name__ ভ্যারিয়েবলের মান পরিবর্তন হয়ে file_two হয়ে গেছে।

কোডের আউটপুট নিম্নরূপ হবেঃ

File two __name__ is set to: file_two
File one __name__ is set to: __main__

কিন্তু file_two সরাসরি চালালে আপনি দেখবেন এর নাম __main__-ই আছেঃ

File two __name__ is set to: __main__

যে ফাইল বা মডিউলকে চালানো হচ্ছে তার __name__ ভ্যারিয়েবলের মান সবসময়েই __main__ হবে। কিন্তু অন্যন্য যেসব মডিউল ইম্পোর্ট করা হচ্ছে তাদের জন্য __name__ ভ্যারিয়েবলের মান সেই মডিউলের নাম হবে।

পাইথন ফাইলের নামকরণের নিয়মাবলী

পাইথন কোডে __name__ এবং __main__ সাধারণত নিম্নোক্ত উপায়ে ব্যবহার করা হয়ঃ

if __name__ == "__main__":
   Do something here

চলুন দেখা যাক বাস্তব জীবনে এটি কিভাবে কাজ করে এবং এই ভ্যারিয়েবল দুটিকে কিভাবে কাজে লাগানো যায়।

file_one এবং file_two কে পরিবর্তন করুনঃ

file_one:

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported"
file_one.py

file_two:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
file_two.py

এবার file_one কে চালালে আপনি দেখবেন যে দুটি মডিউলের মধ্যে কোনটি __main__ তা প্রোগ্রামটি বুঝতে পেরেছে এবং আমাদের প্রথম if else স্টেটমেন্টগুলি অনুযায়ী কোড এক্সিকিউট করেছে।

কোডটির আউটপুট নিম্নরূপ হবেঃ

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly

এবার file_two চালালে আপনি দেখবেন __name__ ভ্যারিয়েবলের মান __main__ হয়ে গেছেঃ

File two __name__ is set to: __main__
File two executed when ran directly

কোন মডিউল ইম্পোর্ট করা করে চালানো হলে মডিউলের ফাংশনগুলি ইম্পোর্ট হবে এবং টপ লেভেল কোড এক্সিকিউট হবে।

এর উদাহরণ দেখতে, আপনার ফাইলগুলিকে নিচের মতো করে পরিবর্তন করুনঃ

file_one:

# Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")
file_one.py

file_two:

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
file_two.py

এবার ফাংশনগুলি লোড হবে কিন্তু চলবে না।

ফাংশনদুটির যে কোন একটিকে চালানোর জন্য file_one এর if __name__ == "__main__" অংশটিকে নিচের মতো করে পরিবর্তন করুনঃ

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
else:
   print("File one executed when imported")

file_one চালানোর সময় আউটপুট নিম্নরূপ হবেঃ

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed

আপনি চাইলে ইম্পোর্ট করা ফাইল থেকেও ফাংশন চালাতে পারেন। তার জন্য file_oneif __name__ == “__main__” অংশটি নিচের মতো করে পরিবর্তন করুনঃ

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   file_two.function_three()
else:
   print("File one executed when imported")

এবার প্রোগ্রামের আউটপুট নিম্নরূপ হওয়ার কথাঃ

File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
Function three is executed

ধরা যাক file_two মডিউলটি অনেক বড়, এতে অনেকগুলি ফাংশন আছে এবং আপনি সবগুলি ফাংশন ইম্পোর্ট করতে চান না। file_two এর কোড নিচের মতো করে পরিবর্তন করুনঃ

# Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

def function_four():
   print("Function four is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
file_two.py

এবার file_one এ নির্দিষ্ট ফাংশনগুলি ইম্পোর্ট করতে from import ব্লক ব্যবহার করুনঃ

# Python module to execute
from file_two import function_three

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   function_three()
else:
   print("File one executed when imported")
file_one.py

উপসংহার

একটি ফাইলকে মেইন প্রোগ্রাম হিসেবে চালানো যাবে নাকি অন্য মডিউলে ইম্পোর্ট করা যাবে তা নির্ধারণ করতে আপনি __name__ ভ্যারিয়েবলটি ব্যবহার করা যায়। আমরা মডিউল ইম্পোর্ট করার সময় একটি if __name__ == "__main__" ব্যবহার করে কোডের অংশবিশেষের এক্সিকিউশন থামিয়ে রাখতে পারি।

যখন পাইথন ইন্টারপ্রেটার একটি ফাইল পড়ে, তখন যদি মডিউলটিকে চালানো হয় তাহলে __name__ ভ্যারিয়েবলের মান হবে __main__ আর যদি মডিউলটিকে ইম্পোর্ট করা হয় তাহলে __name__ ভ্যারিয়েবলের মান হবে ঐ মডিউলের নাম। কোন মডিউলকে ইম্পোর্ট করা হলে তার টপ লেভেল কোডগুলি এক্সিকিউট করা হবে কিন্তু ফাংশন এবং ক্লাসগুলি এক্সিকিউট হবে না।

আমার  freeCodeCamp profile, Medium profile এ এরকম আরও আর্টিকেল পাবেন। আমি যেসব মজা জিনিস বানাই সেগুলি আমার GitHub page এ পেয়ে যাবেন।