लर्निंग पाथ
Python कोड में अक्सर if __name__ == "__main__" से शुरू होने वाला कंडीशनल ब्लॉक दिखाई देता है। यह पंक्ति रहस्यमय लग सकती है, और कई शुरुआती इसे जाने बिना इस्तेमाल करते हैं कि यह क्या करता है या उन्हें इसका इस्तेमाल करना चाहिए या नहीं। अन्य भाषाओं से आने वाले प्रोग्रामर भी इस मुहावरे को गलत समझ सकते हैं और इसका अतिप्रयोग कर सकते हैं।
यह ट्यूटोरियल Python के if__name__ == "__main__" मुहावरे का अर्थ समझाता है और इसे कैसे और कब उपयोग करना है, इस पर चर्चा करता है।
__name__ और "__main__" को समझना
मुहावरा if __name__ == "__main__" एक if स्टेटमेंट है जो समानता की जाँच करता है।
समानता ऑपरेटर == के बाएँ वाला पहला ऑपरेंड एट्रिब्यूट __name__ है। जिन Python नामों की शुरुआत और समाप्ति दोहरे अंडरस्कोर से होती है, वे विशेष पहचानकर्ता होते हैं। हर मॉड्यूल में एक __name__ एट्रिब्यूट होता है। Python इस वेरिएबल को मॉड्यूल के नाम पर सेट करता है, जिसे Python का इम्पोर्ट सिस्टम प्रत्येक मॉड्यूल की अनूठी पहचान के लिए उपयोग करता है।
हालाँकि, यदि मॉड्यूल टॉप-लेवल कोड वातावरण में है, यानी यह प्रोग्राम का एंट्री पॉइंट है, तो Python __name__ एट्रिब्यूट को स्ट्रिंग "__main__" पर सेट करता है।
कुछ उदाहरण देखते हैं। एक स्क्रिप्ट बनाते हैं जिसका नाम है exploring_name_main.py:
# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
इस स्क्रिप्ट को टर्मिनल में निम्न कमांड से सीधे चलाया जा सकता है:
$ python exploring_name_main.py
__main__
random
स्क्रिप्ट exploring_name_main.py टॉप-लेवल कोड वातावरण में है क्योंकि यह प्रोग्राम का एंट्री पॉइंट है। इसलिए, __name__ वेरिएबल स्ट्रिंग "__main__" पर सेट है।
लेकिन random मॉड्यूल इम्पोर्ट किया गया है और टॉप-लेवल कोड वातावरण में नहीं है। उसका __name__ एट्रिब्यूट मॉड्यूल के नाम पर सेट है।
अगले चरण में, हम more_exploration.py नामक एक नई स्क्रिप्ट बनाते हैं, जो पहली स्क्रिप्ट को इम्पोर्ट करती है:
# more_exploration.py
import exploring_name_main
इस स्क्रिप्ट को टर्मिनल में निम्न कमांड से चलाएँ:
$ python more_exploration.py
exploring_name_main
random
किसी मॉड्यूल का कोड तब निष्पादित होता है जब उसे इम्पोर्ट किया जाता है। इसलिए, more_exploration.py चलाने पर, कोड exploring_name_main.py में दो print() कॉल का आउटपुट दिखाता है। चूँकि exploring_name_main.py अब प्रोग्राम का एंट्री पॉइंट नहीं है, उसका __name__ एट्रिब्यूट "__main__" के बजाय स्क्रिप्ट के नाम पर सेट होता है।
if __name__ == "__main__" कंडीशनल ब्लॉक
वेरिएबल __name__ का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोई मॉड्यूल प्रोग्राम का मुख्य एंट्री पॉइंट है या नहीं। इसलिए, कोई मॉड्यूल ऐसा कोड शामिल कर सकता है जो केवल तब निष्पादित हो जब उसे सीधे स्क्रिप्ट के रूप में चलाया जाए, लेकिन इम्पोर्ट करने पर नहीं। कोई भी कोड जो केवल स्क्रिप्ट के सीधे चलने पर चलना चाहिए, उसे if __name__ == "__main__" कंडीशनल ब्लॉक में शामिल किया जाता है:
# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
number = random.randint(1, 10)
if __name__ == "__main__":
print("This script is in the top-level code environment")
print(f"The number is {number}")
अब exploring_name_main.py में if __name__ == "__main__" कंडीशनल ब्लॉक शामिल है। देखते हैं, स्क्रिप्ट चलाते समय क्या फर्क पड़ता है:
$ python exploring_name_main.py
__main__
random
This script is in the top-level code environment
The number is 10
जब स्क्रिप्ट सीधे चलाई जाती है, तो वेरिएबल __name__ स्ट्रिंग "__main__" पर सेट होता है। इसलिए, if स्टेटमेंट की शर्त True होती है, और Python if ब्लॉक का कोड निष्पादित करता है।
लेकिन जब मॉड्यूल इम्पोर्ट किया जाता है, तो __name__ मॉड्यूल के नाम पर सेट होता है, और प्रोग्राम if ब्लॉक को निष्पादित नहीं करता। याद करें कि स्क्रिप्ट more_exploration.py exploring_name_main को इम्पोर्ट करती है:
$ python more_exploration.py
exploring_name_main
random
प्रोग्राम exploring_name_main.py में मौजूद print() फ़ंक्शनों को कॉल नहीं करता। वे कंडीशनल ब्लॉक में हैं जो निष्पादित नहीं होता क्योंकि __name__ "__main__" के बराबर नहीं है।
Python के if __name__ == "__main__" का उपयोग करते समय सर्वोत्तम प्रथाएँ और सुझाव
Python का if __name__ == "__main__" मुहावरा तब उपयोग होता है जब कोड केवल तब चलना चाहिए जब फ़ाइल को स्क्रिप्ट के रूप में चलाया जाए, न कि मॉड्यूल के रूप में इम्पोर्ट किया जाए। स्क्रिप्ट और मॉड्यूल शब्दों में अंतर केवल इस बात में है कि फ़ाइल का उपयोग कैसे किया जाता है। दोनों ही .py एक्सटेंशन वाली फ़ाइलों को संदर्भित करते हैं।
एक सामान्य उपयोग-परिदृश्य वह है जब किसी स्क्रिप्ट में ऐसे वेरिएबल, फ़ंक्शन और क्लास हों जिन्हें अन्य प्रोग्रामों में भी उपयोग किया जा सके। यहाँ shapes.py नामक स्क्रिप्ट का एक उदाहरण है:
# shapes.py
import math
def find_area_of_circle(radius):
return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
return width * height
if __name__ == "__main__":
shape = int(input("Enter 1 for circle, 2 for rectangle: "))
if shape == 1:
radius = int(input("Enter radius: "))
print(f"The area of the circle is {find_area_of_circle(radius)}")
elif shape == 2:
width = int(input("Enter width: "))
height = int(input("Enter height: "))
print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
Enter 1 for circle, 2 for rectangle: 2
Enter width: 10
Enter height: 20
The area of the rectangle is 200
यदि इरादा हमेशा इसे एक स्क्रिप्ट के रूप में चलाने का है, तो इस कोड को if __name__ == "__main__" मुहावरे की आवश्यकता नहीं है। हालाँकि, इस कंडीशनल स्टेटमेंट को शामिल करने से कोड को मॉड्यूल के रूप में इम्पोर्ट करना संभव हो जाता है, बिना if ब्लॉक की पंक्तियाँ चलाए। more_shapes.py नामक एक और स्क्रिप्ट पर विचार करें:
# more_shapes.py
import shapes
radius = 5
print(f"The area of the circle defined in 'more_shapes.py' is: "
f"{shapes.find_area_of_circle(radius)}")
The area of the circle defined in 'more_shapes.py' is: 78.53981633974483
यह नई स्क्रिप्ट, more_shapes.py, इम्पोर्ट स्टेटमेंट के कारण shapes.py में परिभाषित फ़ंक्शनों तक पहुँच रखती है। लेकिन shapes.py के if __name__ == "__main__" ब्लॉक का कोड निष्पादित नहीं होता। यदि shapes.py में if स्टेटमेंट न हो, तो मॉड्यूल इम्पोर्ट होने पर सारा कोड चल जाएगा।
यूज़र इनपुट के लिए if __name__ == "__main__" ब्लॉक का उपयोग एक आम उपयोग-परिदृश्य है। फ़ाइल को मॉड्यूल के रूप में इम्पोर्ट करने पर यूज़र इनपुट छोड़ दिया जाता है, लेकिन टॉप-लेवल कोड के रूप में सीधे चलाने पर शामिल होता है।
main() फ़ंक्शन का उपयोग
if __name__ == "__main__" ब्लॉक में यथासंभव कम स्टेटमेंट रखना सर्वोत्तम प्रथा है, क्योंकि इससे कोड अधिक पठनीय बनता है। ऐसा करने का एक सामान्य तरीका है एक फ़ंक्शन बनाना, जिसे कंडीशनल ब्लॉक में कॉल किया जाए। आमतौर पर इस फ़ंक्शन को main() कहा जाता है, पर कोई भी फ़ंक्शन नाम मान्य है:
# shapes.py
import math
def find_area_of_circle(radius):
return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
return width * height
def main():
shape = int(input("Enter 1 for circle, 2 for rectangle: "))
if shape == 1:
radius = int(input("Enter radius: "))
print(f"The area of the circle is {find_area_of_circle(radius)}")
elif shape == 2:
width = int(input("Enter width: "))
height = int(input("Enter height: "))
print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
if __name__ == "__main__":
main()
main() फ़ंक्शन में मौजूद कोड वही है जो कोड के पिछले संस्करण में सीधे if __name__ == "__main__" ब्लॉक में शामिल था।
Python में, कुछ अन्य प्रोग्रामिंग भाषाओं के विपरीत, प्रोग्राम के मुख्य एंट्री पॉइंट के रूप में main() फ़ंक्शन आवश्यक नहीं है। इसलिए, main() और if __name__ == "__main__" मुहावरे का उपयोग वैकल्पिक है, और इसकी ज़रूरत तभी होती है जब कोड का उपयोग एक स्टैंडअलोन स्क्रिप्ट और मॉड्यूल—दोनों रूपों में करना हो।
Python के if __name__ == "__main__" का एक अन्य सामान्य उपयोग-परिदृश्य है स्क्रिप्ट में टेस्ट शामिल करना। स्क्रिप्ट को सीधे चलाने पर टेस्ट चलेंगे, लेकिन किसी अन्य मॉड्यूल से इम्पोर्ट करने पर नहीं। हालाँकि, यह तरीका सरल मामलों के लिए उपयुक्त है, सर्वोत्तम यही है कि टेस्टिंग के लिए एक अलग मॉड्यूल समर्पित रखा जाए।
निष्कर्ष
Python का if __name__ == "__main__" तब उपयोगी है जब ऐसा कोड शामिल करना हो जो केवल तब चले जब स्क्रिप्ट सीधे चलाई जाए, लेकिन इम्पोर्ट करने पर न चले। Python इंटरप्रेटर __name__ वेरिएबल को मॉड्यूल के इम्पोर्ट होने पर उसके नाम पर और जब मॉड्यूल प्रोग्राम का मुख्य एंट्री पॉइंट हो, तब स्ट्रिंग "__main__" पर सेट करता है।
कुछ अन्य प्रोग्रामिंग भाषाओं के विपरीत, Python को चलाने के लिए main() फ़ंक्शन और if __name__ == "__main__" मुहावरा आवश्यक नहीं है, लेकिन यह एक ऐसा औज़ार है जिसे प्रोग्रामर आवश्यकता पड़ने पर इस्तेमाल कर सकता है।
मैंने यूनिवर्सिटी ऑफ माल्टा में स्नातक स्तर पर भौतिकी और गणित का अध्ययन किया। उसके बाद, मैं लंदन चला गया और इम्पीरियल कॉलेज से भौतिकी में पीएचडी प्राप्त की। मैंने मानव रेटिना की इमेजिंग के लिए नवीन ऑप्टिकल तकनीकों पर काम किया। अब, मैं Python के बारे में लिखने, Python पर संवाद करने और Python सिखाने पर ध्यान केंद्रित करता हूँ।
