इटरेबल ऑब्जेक्ट्स के विपरीत, आप इंडेक्सिंग सिंटैक्स का उपयोग करके फ़ंक्शन से मान एक्सेस नहीं कर सकते।
भले ही कोई फ़ंक्शन एक इटरेबल लौटाता हो, आपको फ़ंक्शन से प्रतिक्रिया को उसके मानों तक पहुंचने से पहले एक वेरिएबल को असाइन करना होगा। अन्यथा, आपको "TypeError: 'function' object is not subscriptable" त्रुटि का सामना करना पड़ता है।
इस गाइड में, हम बात करते हैं कि इस त्रुटि का क्या अर्थ है। हम इस त्रुटि के दो उदाहरण देखते हैं ताकि आप यह पता लगा सकें कि इसे अपने कोड में कैसे हल किया जाए।
TypeError: 'function' object is not subscriptable
सूचियों और स्ट्रिंग्स जैसे इटरेबल ऑब्जेक्ट्स को इंडेक्सिंग नोटेशन का उपयोग करके एक्सेस किया जा सकता है। यह आपको एक इटरेबल से एक व्यक्तिगत आइटम, या आइटम्स की रेंज एक्सेस करने देता है।
निम्न कोड पर विचार करें:
grades = ["A", "A", "B"] print(grades[0])
इंडेक्स पोजीशन 0 पर मान A है। इस प्रकार, हमारा कोड "A" लौटाता है। यह सिंटैक्स फ़ंक्शन पर काम नहीं करता। ऐसा इसलिए है क्योंकि फ़ंक्शन इटरेबल ऑब्जेक्ट नहीं है। फ़ंक्शन केवल एक इटरेबल ऑब्जेक्ट लौटाने में सक्षम हैं यदि उन्हें कॉल किया जाता है।
"TypeError: 'function' object is not subscriptable" त्रुटि तब होती है जब आप फ़ंक्शन को एक्सेस करने का प्रयास करते हैं जैसे कि वह इटरेबल ऑब्जेक्ट हो।
यह त्रुटि दो परिदृश्यों में आम है:
- जब आप एक फ़ंक्शन को इटरेबल के समान नाम असाइन करते हैं
- जब आप फ़ंक्शन से मानों को एक्सेस करने का प्रयास करते हैं जैसे कि फ़ंक्शन इटरेबल हो
आइए इन दोनों परिदृश्यों का विश्लेषण करते हैं।
परिदृश्य #1: इटरेबल के समान नाम वाला फ़ंक्शन
एक प्रोग्राम बनाएं जो स्कूल में एक छात्र के बारे में जानकारी प्रिंट करता है। हम एक छात्र और उनके नवीनतम टेस्ट स्कोर के बारे में जानकारी के साथ एक डिक्शनरी को परिभाषित करके शुरू करते हैं:
student = {
"name": "Holly",
"latest_test_score": "B",
"class": "Sixth Grade"
}
हमारा डिक्शनरी तीन कुंजियों और तीन मानों को समाहित करता है। एक कुंजी छात्र के नाम को दर्शाती है; एक कुंजी छात्र द्वारा अपने नवीनतम टेस्ट पर अर्जित स्कोर को दर्शाती है; एक कुंजी उस कक्षा को दर्शाती है जिसमें छात्र है।
अगला, हम एक फ़ंक्शन परिभाषित करने जा रहे हैं जो इन मानों को कंसोल पर प्रिंट करता है:
def student(pupil):
print("Name: " + pupil["name"])
print("Latest Test Score: " + pupil["latest_test_score"])
print("Class: " + pupil["class"])
हमारा कोड "pupil" डिक्शनरी में तीन मानों को कंसोल पर प्रिंट करता है। "pupil" डिक्शनरी को student() फ़ंक्शन में आर्गुमेंट के रूप में पास किया जाता है।
आइए अपना फ़ंक्शन कॉल करें और "student" डिक्शनरी को पैरामीटर के रूप में पास करें:
student(student)
हमारा पायथन कोड एक त्रुटि फेंकता है:
Traceback (most recent call last): File "main.py", line 8, instudent(student) File "main.py", line 4, in student print("Name: " + pupil["name"]) TypeError: 'function' object is not subscriptable
यह त्रुटि इसलिए होती है क्योंकि हमारे पास एक फ़ंक्शन और एक इटरेबल है जिसका नाम समान है। "student" पहले डिक्शनरी के रूप में घोषित किया जाता है। फिर हम उसी नाम के साथ एक फ़ंक्शन परिभाषित करते हैं। यह "student" को डिक्शनरी के बजाय फ़ंक्शन बनाता है।
जब हम "student" को student() फ़ंक्शन में पैरामीटर के रूप में पास करते हैं, तो हम "student" नाम के फ़ंक्शन को पास कर रहे हैं।
हम इस समस्या को अपने student फ़ंक्शन का नाम बदलकर हल करते हैं:
def show_student_details(pupil):
print("Name: " + pupil["name"])
print("Latest Test Score: " + pupil["latest_test_score"])
print("Class: " + pupil["class"])
show_student_details(student)
हमने अपने फ़ंक्शन का नाम "show_student_details" बदल दिया है। आइए अपना कोड चलाते हैं और देखते हैं क्या होता है:
Name: Holly Latest Test Score: B Class: Sixth Grade
हमारा कोड सफलतापूर्वक हमारे छात्र के बारे में जानकारी को कंसोल पर प्रिंट करता है।
परिदृश्य #2: इंडेक्सिंग का उपयोग करके फ़ंक्शन एक्सेस करना
एक प्रोग्राम लिखें जो छात्र रिकॉर्ड की सूची को फ़िल्टर करता है और केवल उन्हीं को दिखाता है जहां छात्र ने अपने नवीनतम टेस्ट पर A ग्रेड अर्जित किया है।
हम छात्रों की एक सरणी को परिभाषित करके शुरू करेंगे:
students = [
{ "name": "Holly", "grade": "B" },
{ "name": "Samantha", "grade": "A" },
{ "name": "Ian", "grade": "A" }
]
हमारी छात्र सूची में तीन डिक्शनरी हैं। प्रत्येक डिक्शनरी में छात्र का नाम और उनके सबसे हालिया टेस्ट पर अर्जित ग्रेड होता है।
अगला, एक फ़ंक्शन परिभाषित करें जो उन छात्रों की सूची लौटाता है जिन्होंने A ग्रेड अर्जित किया है:
def get_a_grade_students(pupils):
a_grade_students = []
for p in pupils:
if p["grade"] == "A":
a_grade_students.append(p)
print(a_grade_students)
return a_grade_students
फ़ंक्शन "pupils" नामक छात्रों की सूची स्वीकार करता है। हमारा फ़ंक्शन for लूप का उपयोग करके उस सूची पर इटरेट करता है। यदि किसी विशेष छात्र ने "A" ग्रेड अर्जित किया है, तो उनका रिकॉर्ड "a_grade_students" सूची में जोड़ा जाता है। अन्यथा, कुछ नहीं होता।
एक बार सभी छात्रों की खोज हो जाने के बाद, हमारा कोड उन छात्रों की सूची प्रिंट करता है जिन्होंने "A" ग्रेड अर्जित किया और उस सूची को मेन प्रोग्राम में लौटाता है।
हम पहले छात्र को पुनः प्राप्त करना चाहते हैं जिसने "A" ग्रेड अर्जित किया। ऐसा करने के लिए, हम अपना फ़ंक्शन कॉल करते हैं और पहले छात्र के रिकॉर्ड को पुनः प्राप्त करने के लिए इंडेक्सिंग सिंटैक्स का उपयोग करते हैं:
first = get_a_grade_students[0] print(first)
हमारा कोड चलाएं:
Traceback (most recent call last): File "main.py", line 16, infirst = get_a_grade_students[0] TypeError: 'function' object is not subscriptable
हमारा कोड एक त्रुटि लौटाता है। हम पहले फ़ंक्शन को कॉल किए बिना "get_a_grade_students" फ़ंक्शन से मान एक्सेस करने का प्रयास कर रहे हैं।
इस समस्या को हल करने के लिए, हमें अपने फ़ंक्शन को कॉल करना चाहिए इससे पहले कि हम उससे मान पुनः प्राप्त करने का प्रयास करें:
a_grades = get_a_grade_students(students) first = a_grades[0] print(first)
सबसे पहले, हम अपने get_a_grade_students() फ़ंक्शन को कॉल करते हैं और पैरामीटर के रूप में अपनी छात्र सूची निर्दिष्ट करते हैं। अगला, हम get_a_grade_students() फ़ंक्शन द्वारा लौटाई गई सूची से इंडेक्स पोजीशन 0 पर रिकॉर्ड पुनः प्राप्त करने के लिए इंडेक्सिंग का उपयोग करते हैं। अंत में, हम उस रिकॉर्ड को कंसोल पर प्रिंट करते हैं।
आइए अपना कोड निष्पादित करते हैं:
[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}]
{'name': 'Samantha', 'grade': 'A'}
हमारा कोड पहले उन सभी छात्रों की सूची प्रिंट करता है जिन्होंने "A" ग्रेड अर्जित किया। अगला, हमारा कोड सूची में पहला छात्र प्रिंट करता है जिसने "A" ग्रेड अर्जित किया। उस मामले में वह छात्र सामंथा थी।
निष्कर्ष
"TypeError: 'function' object is not subscriptable" त्रुटि तब उठाई जाती है जब आप किसी फ़ंक्शन से आइटम एक्सेस करने का प्रयास करते हैं जैसे कि फ़ंक्शन इटरेबल ऑब्जेक्ट हो, जैसे स्ट्रिंग या सूची।
इस त्रुटि को हल करने के लिए, पहले सुनिश्चित करें कि आप किसी वेरिएबल को ओवरराइड नहीं करते जो फ़ंक्शन को आपके द्वारा वेरिएबल घोषित करने के बाद घोषित करके मान संग्रहीत करता है। अगला, सुनिश्चित करें कि आप फ़ंक्शन को पहले कॉल करते हैं इससे पहले कि आप उन मानों तक पहुंचने का प्रयास करें जो यह लौटाता है।
अब आप इस सामान्य पायथन त्रुटि को एक पेशेवर कोडर की तरह हल करने के लिए तैयार हैं!