কম্পিউটার টিউটোরিয়াল

পাইথন TypeError: 'function' object is not subscriptable সমাধান

ইটারেবল অবজেক্টের বিপরীতে, আপনি একটি ফাংশন থেকে ইনডেক্সিং সিনট্যাক্স ব্যবহার করে একটি ভ্যালু অ্যাক্সেস করতে পারবেন না।

এমনকি যদি একটি ফাংশন একটি ইটারেবল রিটার্ন করে, আপনাকে অবশ্যই একটি ফাংশন থেকে রেসপন্স একটি ভেরিয়েবলে অ্যাসাইন করতে হবে তার ভ্যালুগুলো অ্যাক্সেস করার আগে। অন্যথায়, আপনি একটি "TypeError: 'function' object is not subscriptable" এরর এনকাউন্টার করবেন।

এই গাইডে, আমরা এই এরর কী বোঝায় সেটি আলোচনা করব। আমরা এই এররের দুটি উদাহরণের মাধ্যমে যাব যাতে আপনি আপনার কোডে কীভাবে এটি সমাধান করবেন সেটি বুঝতে পারেন।

TypeError: 'function' object is not subscriptable

ইটারেবল অবজেক্ট যেমন লিস্ট এবং স্ট্রিং ইনডেক্সিং নোটেশন ব্যবহার করে অ্যাক্সেস করা যায়। এতে আপনি একটি ইটারেবল থেকে একটি ইনডিভিজুয়াল আইটেম, বা আইটেমের একটি রেঞ্জ অ্যাক্সেস করতে পারেন।

নিচের কোডটি বিবেচনা করুন:

grades = ["A", "A", "B"]
print(grades[0])

ইন্ডেক্স পজিশন ০-এ থাকা ভ্যালু A। তাই, আমাদের কোড "A" রিটার্ন করে। এই সিনট্যাক্স একটি ফাংশনে কাজ করে না। এর কারণ হল একটি ফাংশন একটি ইটারেবল অবজেক্ট নয়। ফাংশনগুলো শুধু একটি ইটারেবল অবজেক্ট রিটার্ন করতে পারে যদি সেগুলো কল করা হয়।

"TypeError: 'function' object is not subscriptable" এররটি ঘটে যখন আপনি একটি ফাংশন অ্যাক্সেস করার চেষ্টা করেন যেন সেটি একটি ইটারেবল অবজেক্ট হয়।

এই এররটি দুটি সিনেরিওতে সাধারণ:

  • যখন আপনি একটি ফাংশনকে একটি ইটারেবলের মতো একই নাম দেন
  • যখন আপনি একটি ফাংশন থেকে ভ্যালুগুলো অ্যাক্সেস করার চেষ্টা করেন যেন ফাংশনটি ইটারেবল হয়

চলুন এই দুটি সিনেরিও বিশ্লেষণ করি।

সিনেরিও #১: একটি ইটারেবলের মতো একই নামের ফাংশন

একটি প্রোগ্রাম তৈরি করি যা একটি স্কুলে একজন ছাত্র সম্পর্কে ইনফরমেশন প্রিন্ট আউট করে। আমরা একটি ছাত্র এবং তাদের লেটেস্ট টেস্ট স্কোর সম্পর্কে ইনফরমেশন সহ একটি ডিকশনারি ডিফাইন করে শুরু করি:

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, in 
student(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

আমাদের কোড সফলভাবে আমাদের ছাত্র সম্পর্কে ইনফরমেশন কনসোলে প্রিন্ট আউট করল।

সিনেরিও #২: ইনডেক্সিং ব্যবহার করে একটি ফাংশন অ্যাক্সেস করা

একটি প্রোগ্রাম লিখি যা একটি ছাত্র রেকর্ডের লিস্ট ফিল্টার করে এবং শুধু সেগুলো দেখায় যেখানে একজন ছাত্র তাদের লেটেস্ট টেস্টে 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, in 
first = 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() ফাংশন যে লিস্টটি রিটার্ন করে সেটি থেকে ইন্ডেক্স পজিশন ০-এ থাকা রেকর্ড রিট্রিভ করি। অবশেষে, আমরা সেই রেকর্ডটি কনসোলে প্রিন্ট করি।

চলুন আমাদের কোড এক্সিকিউট করি:

[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}]
{'name': 'Samantha', 'grade': 'A'}

আমাদের কোড প্রথমে "A" গ্রেড পাওয়া সব ছাত্রদের লিস্ট প্রিন্ট আউট করল। পরবর্তীতে, আমাদের কোড লিস্টে "A" গ্রেড পাওয়া প্রথম ছাত্র প্রিন্ট আউট করল। এই কেসে সেটি সামান্থা ছিল।

উপসংহার

"TypeError: 'function' object is not subscriptable" এররটি উঠে যখন আপনি একটি ফাংশন থেকে একটি আইটেম অ্যাক্সেস করার চেষ্টা করেন যেন ফাংশনটি একটি ইটারেবল অবজেক্ট হয়, স্ট্রিং বা লিস্টের মতো।

এই এররটি সমাধান করতে, প্রথমে নিশ্চিত করুন যে আপনি কোনো ভেরিয়েবল ওভাররাইড করছেন না যেটি ভ্যালু স্টোর করে একটি ফাংশন ডিক্লেয়ার করার পর ভেরিয়েবলটি ডিক্লেয়ার করার পর। পরবর্তীতে, নিশ্চিত করুন যে আপনি একটি ফাংশন প্রথমে কল করছেন তার ভ্যালুগুলো অ্যাক্সেস করার চেষ্টা করার আগে।

এখন আপনি এই সাধারণ পাইথন এররটি প্রফেশনাল কোডারের মতো সমাধান করার জন্য রেডি!

  1. জাভাস্ক্রিপ্ট TypeError: 'undefined' is not an object

  2. পাইথনে issubset() ফাংশন

  3. পাইথনে ফাংশন থেকে অবজেক্ট রিটার্ন কীভাবে করবেন?

  4. পাইথন ফাংশন থেকে JSON অবজেক্ট রিটার্ন করা