कोर्स
Python में एक आम त्रुटि संदेश इस प्रकार है:
'builtin_function_or_method' object is not subscriptable
जब किसी फ़ंक्शन या मेथड के बाद स्क्वायर ब्रैकेट्स [] लिख दिए जाते हैं, तो Python यह त्रुटि उठाता है। जबकि, फ़ंक्शंस कॉल करने योग्य ऑब्जेक्ट होते हैं। इसलिए, उन्हें पेरेंथेसिस () की आवश्यकता होती है, जिन्हें कभी-कभी राउंड ब्रैकेट्स भी कहा जाता है।
आइए एक उदाहरण देखें जहाँ Python यह त्रुटि देता है:
numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
अगला अनुभाग इस त्रुटि को और विस्तार से समझाता है।
त्रुटि को समझना
Python फ़ंक्शंस कॉल करने योग्य ऑब्जेक्ट होते हैं, यानी हम फ़ंक्शन नाम के बाद पेरेंथेसिस लगाकर उसकी परिभाषा में लिखा कोड चला सकते हैं। Python में बिल्ट-इन फ़ंक्शन का सबसे आम उदाहरण print() है:
print("This is a built-in function")
This is a built-in function
Python में फ़ंक्शन कॉल करने के लिए पेरेंथेसिस का उपयोग होता है। लेकिन, पेरेंथेसिस की जगह स्क्वायर ब्रैकेट्स का उपयोग करने पर त्रुटि आती है:
print["This is a built-in function"]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
आइए त्रुटि संदेश के मुख्य हिस्सों को तोड़कर समझें:
- A 'builtin_function_or_method' object
- Not subscriptable
ऊपर के उदाहरण में, print() एक बिल्ट-इन फ़ंक्शन है। विवरण में मेथड्स का भी ज़िक्र है, जो किसी क्लास का हिस्सा होने वाले फ़ंक्शंस होते हैं। Python में इसके डेटा टाइप्स से जुड़े कई बिल्ट-इन मेथड्स हैं। आइए एक और उदाहरण देखें जिसमें यही त्रुटि आती है:
name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
सामान्य रूप से फ़ंक्शंस की तरह, .count() मेथड को भी पेरेंथेसिस चाहिए:
print(name.count("a"))
3
यह स्थिति परिचय के उदाहरण के समान है, जिसमें लिस्ट मेथड .append() है। यहाँ पेरेंथेसिस के साथ सही रूप देखें:
numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)
[2, 4, 6, 8, 10]
TypeError: 'function' object is not subscriptable
यूज़र-परिभाषित फ़ंक्शंस के साथ भी Python इसी तरह की त्रुटि देता है:
def greet_person(name):
print(f"Hello {person}")
greet_person["James"]
Traceback (most recent call last):
...
TypeError: 'function' object is not subscriptable
हालाँकि, greet_person() Python का बिल्ट-इन फ़ंक्शन नहीं है। त्रुटि संदेश बताता है कि यह 'builtin_function_or_method' नहीं बल्कि 'function' है।
त्रुटि संदेश का दूसरा भाग 'subscriptable' शब्द से संबंधित है। कोई Python ऑब्जेक्ट सबस्क्रिप्टेबल तब होता है जब हम उसके किसी तत्व तक पहुँचने के लिए स्क्वायर ब्रैकेट्स का उपयोग कर सकते हैं। सबस्क्रिप्टेबल ऑब्जेक्ट का एक आम उदाहरण है sequence, जिसे स्क्वायर ब्रैकेट्स से इंडेक्स किया जा सकता है:
print(numbers[0])
print(numbers[-1])
print(numbers[1:4])
2
10
[4, 6, 8]
ट्यूपल और स्ट्रिंग्स सीक्वेंसेज़ के अन्य उदाहरण हैं। इसलिए, ये भी सबस्क्रिप्टेबल हैं:
more_numbers = 10, 30, 50
print(more_numbers[0])
name = "DataCamp"
print(name[0])
10
'D'
Python mappings भी सबस्क्रिप्टेबल होते हैं। Python में सबसे आम मैपिंग डिक्शनरी है:
points = {"James": 10, "Mary": 14}
print(points["Mary"])
14
डिक्शनरी में इंडेक्स की जगह स्क्वायर ब्रैकेट्स के अंदर कीज़ का उपयोग होता है।
Python: Callable बनाम Subscriptable
सीक्वेंसेज़ और मैपिंग्स सबस्क्रिप्टेबल Python ऑब्जेक्ट्स के उदाहरण हैं। हम ऑब्जेक्ट के नाम के बाद स्क्वायर ब्रैकेट्स लगाकर डेटा संरचना के भीतर से किसी ऑब्जेक्ट तक पहुँच सकते हैं। कोई Python क्लास .__getitem__() स्पेशल मेथड परिभाषित करती है, तो वह सबस्क्रिप्टेबल ऑब्जेक्ट बनाती है।
फ़ंक्शंस और मेथड्स कॉल करने योग्य ऑब्जेक्ट्स के उदाहरण हैं। हम इनके नाम के बाद पेरेंथेसिस लगाकर इन्हें कॉल कर सकते हैं। किसी फ़ंक्शन या मेथड को कॉल करने से उसकी परिभाषा में लिखा कोड चलता है।
क्लासेस भी कॉल करने योग्य Python ऑब्जेक्ट्स हैं। किसी क्लास को कॉल करने पर उसका एक इंस्टेंस बनता है। सामान्यतः, कोई Python ऑब्जेक्ट तब कॉल करने योग्य होता है जब उसकी क्लास .__call__() स्पेशल मेथड परिभाषित करती है।
जब हम किसी ऐसे ऑब्जेक्ट को कॉल करने की कोशिश करते हैं जो कॉल करने योग्य नहीं है, तो Python इसी तरह का त्रुटि संदेश देता है:
numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
...
TypeError: 'list' object is not callable
वेरिएबल numbers एक लिस्ट है, जो कॉल करने योग्य नहीं है। लिस्ट का पहला आइटम एक्सेस करने का सही तरीका स्क्वायर ब्रैकेट्स हैं: numbers[0]। Python में फ़ंक्शंस, मेथड्स, और क्लासेस सबसे आम कॉल करने योग्य ऑब्जेक्ट्स हैं।
'builtin_function_or_method' object is not subscriptable को ठीक करें
जब किसी फ़ंक्शन या मेथड के बाद स्क्वायर ब्रैकेट्स लगते हैं, तो Python यह त्रुटि संदेश ``'builtin_function_or_method' object is not subscriptable` देता है। फ़ंक्शन या मेथड नाम के ठीक बाद स्क्वायर ब्रैकेट्स पर ध्यान दें और उन्हें पेरेंथेसिस से बदलें।
कुछ स्थितियों में, किसी फ़ंक्शन या मेथड का आर्ग्युमेंट एक लिस्ट होती है, जिसे स्क्वायर ब्रैकेट्स से परिभाषित किया जाता है। लेकिन ध्यान दें कि यह लिस्ट पेरेंथेसिस के अंदर परिभाषित होती है:
number_of_values = len([10, 30, 50])
print(number_of_values)
numbers = [2, 4, 6, 8]
numbers.extend([10, 12])
print(numbers)
3
[2, 4, 6, 8, 10, 12]
इन उदाहरणों में, फ़ंक्शन या मेथड नाम के बाद पेरेंथेसिस हैं। पेरेंथेसिस के भीतर दिया गया आर्ग्युमेंट एक लिस्ट है। लिस्ट परिभाषित करने के लिए स्क्वायर ब्रैकेट्स का जो नोटेशन है, वह सीक्वेंसेज़, मैपिंग्स, और अन्य सबस्क्रिप्टेबल ऑब्जेक्ट्स के साथ उपयोग होने वाले स्क्वायर ब्रैकेट्स नोटेशन से भिन्न होता है।
डिबगिंग टिप्स
एक काम जो आप कर सकते हैं, वह है बिल्ट-इन type() फ़ंक्शन का उपयोग करके ऑब्जेक्ट टाइप जाँचना:
print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))
<class 'builtin_function_or_method'>
आउटपुट पुष्टि करता है कि ऑब्जेक्ट एक बिल्ट-इन फ़ंक्शन या मेथड है, जो कॉल करने योग्य है। एक बिल्ट-इन फ़ंक्शन callable() भी है, जो यदि उसका आर्ग्युमेंट कॉल किया जा सकता है तो True लौटाता है:
print(callable(numbers.append))
True
अन्य डिबगिंग टिप्स जिन पर विचार करें:
- ब्रैकेट्स या पेरेंथेसिस के प्रकार की जाँच करें। कॉल करने योग्य ऑब्जेक्ट्स, जैसे फ़ंक्शंस और मेथड्स, के बाद पेरेंथेसिस होने चाहिए। स्क्वायर ब्रैकेट्स का उपयोग सीक्वेंसेज़, मैपिंग्स और अन्य सबस्क्रिप्टेबल ऑब्जेक्ट्स के लिए होता है।
- त्रुटि संदेश में बिल्ट-इन फ़ंक्शंस या मेथड्स और सबस्क्रिप्टेबल ऑब्जेक्ट्स के संदर्भों में सुराग ढूँढें। त्रुटि संदेशों में दी गई लाइन संख्या उस लाइन की ओर इशारा करती है जिसमें त्रुटि है।
निष्कर्ष
Python जैसी प्रोग्रामिंग भाषाएँ अलग-अलग प्रयोजनों के लिए अलग-अलग चिह्नों का उपयोग करती हैं। किसी डेटा संरचना से तत्व एक्सेस करने के लिए ऑब्जेक्ट नाम के तुरंत बाद स्क्वायर ब्रैकेट्स का उपयोग होता है। यह स्क्वायर ब्रैकेट नोटेशन सबस्क्रिप्टेबल ऑब्जेक्ट्स पर काम करता है। स्क्वायर ब्रैकेट्स का उपयोग तब भी होता है जब वे तुरंत किसी ऑब्जेक्ट नाम के बाद नहीं आते और हम लिस्ट बनाते हैं।
पेरेंथेसिस का उपयोग ऑब्जेक्ट नाम के बाद ऑब्जेक्ट को कॉल करने के लिए होता है। Python में फ़ंक्शंस और मेथड्स कॉल करने योग्य ऑब्जेक्ट्स के उदाहरण हैं। पेरेंथेसिस ट्यूपल्स से भी संबंधित हैं, और आवश्यकता होने पर किसी स्टेटमेंट के हिस्सों को समूहित करने के लिए उपयोग किए जाते हैं।
जब किसी बिल्ट-इन फ़ंक्शन या मेथड के बाद स्क्वायर ब्रैकेट्स लगते हैं, तो Python अपवाद 'builtin_function_or_method' object is not subscriptable उठाता है। किसी फ़ंक्शन या मेथड को कॉल करने का सही तरीका पेरेंथेसिस का उपयोग करना है।
आप DataCamp के Python Functions: How to Call & Write Functions में फ़ंक्शंस के बारे में और पढ़ सकते हैं।
मैंने यूनिवर्सिटी ऑफ माल्टा में स्नातक स्तर पर भौतिकी और गणित का अध्ययन किया। उसके बाद, मैं लंदन चला गया और इम्पीरियल कॉलेज से भौतिकी में पीएचडी प्राप्त की। मैंने मानव रेटिना की इमेजिंग के लिए नवीन ऑप्टिकल तकनीकों पर काम किया। अब, मैं Python के बारे में लिखने, Python पर संवाद करने और Python सिखाने पर ध्यान केंद्रित करता हूँ।
