TypeError: 'method' object is not subscriptable
पायथन में, मेथड्स को कॉल करने के लिए पैरेंथेसिस ( ) का उपयोग करना आवश्यक होता है। यदि आप किसी मेथड को कॉल करने के लिए स्क्वायर ब्रैकेट्स [ ] का उपयोग करते हैं, तो आपको "TypeError: 'method' object is not subscriptable" एरर प्राप्त होगी।
सबस्क्रिप्टेबल ऑब्जेक्ट्स क्या होते हैं?
सबस्क्रिप्टेबल ऑब्जेक्ट्स वे होते हैं जिनमें __getitem__ मेथड होता है। ये डेटा टाइप्स होते हैं जैसे लिस्ट्स, डिक्शनरीज़, और टुपल्स। __getitem__ मेथड पायथन इंटरप्रेटर को कलेक्शन से व्यक्तिगत आइटम प्राप्त करने की अनुमति देता है।
सभी ऑब्जेक्ट्स सबस्क्रिप्टेबल नहीं होते। उदाहरण के लिए, मेथड्स सबस्क्रिप्टेबल नहीं होते क्योंकि वे __getitem__ मेथड को इम्प्लीमेंट नहीं करते। इसका मतलब है कि आप स्क्वायर ब्रैकेट सिंटैक्स का उपयोग करके मेथड में आइटम्स को एक्सेस नहीं कर सकते या मेथड को कॉल नहीं कर सकते।
उदाहरण परिदृश्य
यहाँ हम एक प्रोग्राम बनाते हैं जो चीज़ों को ऑब्जेक्ट्स में स्टोर करता है। "Cheese" क्लास जिसमें हम चीज़ को परिभाषित करते हैं, उसमें एक मेथड होगा जो चेक करेगा कि क्या कोई चीज़ किसी विशेष देश से संबंधित है।
class Cheese:
def __init__(self, name, origin):
self.name = name
self.origin = origin
def get_country(self, to_compare):
if to_compare == self.origin:
print("{} is from {}.".format(self.name, self.origin))
else:
print("{} is not from {}. It is from {}.".format(self.name, to_compare, self.origin))
हमारा क्लास दो मेथड्स रखता है। पहला मेथड Cheese ऑब्जेक्ट की संरचना को परिभाषित करता है। दूसरा हमें चेक करने देता है कि क्या चीज़ का मूल देश किसी विशेष मान के बराबर है।
अब, हम अपने Cheese क्लास से एक ऑब्जेक्ट बनाते हैं:
edam = Cheese("Edam", "Netherlands")
वेरिएबल "edam" एक ऑब्जेक्ट है। चीज़ से जुड़ा नाम Edam है और इसका मूल देश Netherlands है।
अब, आइए अपने get_country() मेथड को कॉल करें:
edam.get_country["Germany"]
यह कोड Cheese क्लास से get_country() मेथड को एक्जीक्यूट करता है। get_country() मेथड चेक करता है कि क्या हमारे "edam" ऑब्जेक्ट में "origin" का मान "Germany" के बराबर है।
कोड चलाएं और देखें क्या होता है:
Traceback (most recent call last): File "main.py", line 14, inedam.get_country["Germany"] TypeError: 'method' object is not subscriptable
हमारे कोड में एरर आती है।
समाधान
आइए उस कोड लाइन का विश्लेषण करें जिसे पायथन डिबगर ने गलत बताया है:
edam.get_country["Germany"]
इस कोड लाइन में, हम get_country() मेथड को कॉल करने के लिए स्क्वायर ब्रैकेट्स का उपयोग कर रहे हैं। यह स्वीकार्य सिंटैक्स नहीं है क्योंकि स्क्वायर ब्रैकेट्स का उपयोग लिस्ट से आइटम्स एक्सेस करने के लिए किया जाता है। चूंकि फंक्शन्स और ऑब्जेक्ट्स सबस्क्रिप्टेबल नहीं होते, हम उन्हें कॉल करने के लिए स्क्वायर ब्रैकेट्स का उपयोग नहीं कर सकते।
इस एरर को हल करने के लिए, हमें स्क्वायर ब्रैकेट्स को पैरेंथेसिस से बदलना होगा:
edam.get_country("Germany")
आइए अपना कोड चलाएं और देखें क्या होता है:
Edam is not from Germany. It is from Netherlands.
हमारा कोड सफलतापूर्वक एक्जीक्यूट होता है। आइए चेक करें कि क्या Edam "Netherlands" से है ताकि हमारा फंक्शन सभी केस में काम करे, चाहे हम जो मान निर्दिष्ट करें वह चीज़ के मूल देश के बराबर हो या नहीं:
edam.get_country("Netherlands")
हमारा कोड रिटर्न करता है:
Edam is from Netherlands.
हमारा कोड तब काम करता है जब हमारे द्वारा निर्दिष्ट मान चीज़ के मूल देश के बराबर होता है।
निष्कर्ष
"TypeError: 'method' object is not subscriptable" एरर तब आती है जब आप क्लास के अंदर किसी मेथड को कॉल करने के लिए स्क्वायर ब्रैकेट्स का उपयोग करते हैं। इस एरर को हल करने के लिए, सुनिश्चित करें कि आप क्लास के मेथड्स को केवल पैरेंथेसिस का उपयोग करके कॉल करते हैं, उस मेथड के नाम के बाद जिसे आप कॉल करना चाहते हैं।
अब आप इस आम पायथन एरर को एक प्रोफेशनल कोडर की तरह हल करने के लिए तैयार हैं!