पायथन मॉड्यूल भ्रमित करने वाले होते हैं, खासकर जब आप अपना खुद का परिभाषित करते हैं। "TypeError: 'module' object is not callable" सबसे आम गलतियों में से एक है जो पायथन डेवलपर्स क्लासेस के साथ काम करते समय करते हैं।
इस गाइड में, हम बात करते हैं कि इस त्रुटि का क्या अर्थ है और यह क्यों उठाई जाती है। हम इस त्रुटि को दूर करने में आपकी मदद करने के लिए एक उदाहरण कोड स्निपेट के माध्यम से चलते हैं। शुरू करते हैं!
समस्या: TypeError: 'module' object is not callable
कोई भी पायथन फ़ाइल एक मॉड्यूल है जब तक यह एक्सटेंशन ".py" में समाप्त होती है।
मॉड्यूल पायथन का एक महत्वपूर्ण हिस्सा हैं क्योंकि वे आपको एक मुख्य प्रोग्राम के बाहर फ़ंक्शन्स, वेरिएबल्स और क्लासेस को परिभाषित करने देते हैं। इसका अर्थ है कि आप अपने कोड को कई फ़ाइलों में विभाजित कर सकते हैं और इसे अधिक प्रभावी ढंग से वर्गीकृत कर सकते हैं।
मॉड्यूल को एक निश्चित तरीके से आयात किया जाना चाहिए। अन्यथा, पायथन एक त्रुटि लौटाता है:
TypeError: 'module' object is not callable
यह तब होता है जब आप एक मॉड्यूल को फ़ंक्शन के रूप में आयात करने का प्रयास करते हैं।
एक उदाहरण परिदृश्य
"cakes" नामक एक मॉड्यूल परिभाषित करें। इस मॉड्यूल में एक फ़ंक्शन है: read_file। read_file फ़ंक्शन एक टेक्स्ट फ़ाइल की सामग्री पढ़ेगा।
हमारा फ़ाइल नाम हमारे मॉड्यूल का नाम निर्धारित करता है। क्योंकि हम चाहते हैं कि हमारा मॉड्यूल "cakes" कहलाए, हम अपना कोड cakes.py नामक फ़ाइल में लिखते हैं:
def read_file():
all_cakes = []
with open("cakes.txt", "r") as cake_file:
cake_list = cake_file.readlines()
for c in cake_list:
all_cakes.append(c.replace("\n", ""))
return all_cakes
यह फ़ंक्शन "cakes.txt" नामक फ़ाइल की सामग्री पढ़ता है। फिर यह फ़ाइल में टेक्स्ट की प्रत्येक पंक्ति के माध्यम से इटरेट करता है और प्रत्येक पंक्ति को "all_cakes" नामक सूची में जोड़ता है।
replace() मेथड का उपयोग किसी भी नई लाइन ("\n") वर्ण को खाली मान से बदलने के लिए किया जाता है। यह सभी नई लाइनों को हटा देता है। हम अपने फ़ंक्शन के अंत में "all_cakes" लौटाते हैं।
अब, app.py नामक एक फ़ाइल खोलें और यह कोड पेस्ट करें:
import cakes cake_list = cakes() print(cake_list)
यह कोड "cakes.txt" फ़ाइल की सामग्री पढ़ने के लिए हमारे "cakes" मॉड्यूल का उपयोग करता है। फिर यह फ़ंक्शन द्वारा फ़ाइल में पाए गए सभी केक प्रिंट करता है।
आइए अपना कोड चलाते हैं:
Traceback (most recent call last): File "main.py", line 3, incakes = cakes() TypeError: 'module' object is not callable
हमारा कोड एक त्रुटि लौटाता है।
समाधान
आइए हमारे app.py फ़ाइल में इम्पोर्ट स्टेटमेंट पर एक नज़र डालते हैं:
import cakes
हम "cakes" मॉड्यूल आयात करते हैं। इसमें वे सभी वेरिएबल्स, क्लासेस और फ़ंक्शन्स होते हैं जिन्हें हम "cakes.py" फ़ाइल में घोषित करते हैं।
अब, आइए कोड की हमारी अगली पंक्ति पर नज़र डालते हैं:
cake_list = cakes()
हालांकि "cakes" मॉड्यूल में केवल एक फ़ंक्शन है, हम यह निर्दिष्ट नहीं करते कि वह फ़ंक्शन क्या है। यह पायथन को भ्रमित करता है क्योंकि यह नहीं जानता कि उसे किस फ़ंक्शन के साथ काम करना चाहिए।
इस त्रुटि को हल करने के लिए, हम उस फ़ंक्शन का नाम कॉल करते हैं जिसे हम मॉड्यूल के बजाय संदर्भित करना चाहते हैं:
import cakes cake_list = cakes.read_file() print(cake_list)
आइए अपना कोड फिर से चलाने का प्रयास करते हैं:
['Cinnamon Babka', 'Chocolate Cupcake']
हमारा कोड सफलतापूर्वक केक की सूची लौटाता है।
हमारे app.py फ़ाइल में, हम cakes.read_file() कॉल करते हैं।
पायथन उस फ़ाइल "cakes.py" को देखता है जहां हमारा "cakes" मॉड्यूल संग्रहीत है और read_file() फ़ंक्शन का पता लगाता है। फिर, पायथन उस फ़ंक्शन को निष्पादित करता है।
हम read_file() फ़ंक्शन के परिणाम को "cake_list" नामक वेरिएबल को असाइन करते हैं। फिर, हम उस सूची को कंसोल पर प्रिंट करते हैं।
वैकल्पिक रूप से, read_file फ़ंक्शन को सीधे हमारे प्रोग्राम में आयात करें:
from cakes import read_file cake_list = read_file() print(cake_list)
हमारा कोड लौटाता है:
['Cinnamon Babka', 'Chocolate Cupcake']
हमारा कोड "cakes" मॉड्यूल से read_file() फ़ंक्शन निष्पादित करता है। इस उदाहरण में, हम पूरा "cakes" मॉड्यूल आयात करते हैं। इसके बजाय, हम "cakes" मॉड्यूल से एक फ़ंक्शन आयात करते हैं: read_file।
ध्यान दें कि जब हम read_file आयात करते हैं, तो हमें अपने फ़ंक्शन को कॉल करने के लिए cakes.read_file() का उपयोग करने की आवश्यकता नहीं होती है। हम read_file() का उपयोग करते हैं क्योंकि हम read_file() फ़ंक्शन को सीधे अपने कोड में आयात करते हैं।
निष्कर्ष
पायथन मॉड्यूल का कोड एक अलग फ़ाइल में मौजूद होता है। फ़ंक्शन्स और मानों को मॉड्यूल से आयात करने के कुछ अलग तरीके हैं और गड़बड़ करना आसान है।
जब आप मॉड्यूल के साथ काम करते हैं, तो सुनिश्चित करें कि आप उन फ़ंक्शन्स, क्लासेस और वेरिएबल्स को सही ढंग से संदर्भित करते हैं जिन्हें आप एक्सेस करना चाहते हैं। यदि आप किसी फ़ंक्शन को संदर्भित करना चाहते हैं तो मॉड्यूल को स्वयं कॉल करने के बजाय मॉड्यूल से आप जिस सटीक फ़ंक्शन को कॉल करना चाहते हैं उसे निर्दिष्ट करने की आवश्यकता है।
अब आप इस पायथन TypeError को एक पेशेवर डेवलपर की तरह हल करने के लिए तैयार हैं!