কম্পিউটার

Python TypeError:'ফাংশন' অবজেক্ট সাবস্ক্রিপ্টযোগ্য সমাধান নয়

পুনরাবৃত্তিযোগ্য বস্তুর বিপরীতে, আপনি ইনডেক্সিং সিনট্যাক্স ব্যবহার করে একটি ফাংশন থেকে একটি মান অ্যাক্সেস করতে পারবেন না।

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

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

TypeError:'ফাংশন' অবজেক্ট সাবস্ক্রিপ্টযোগ্য নয়

পুনরাবৃত্ত বস্তু যেমন তালিকা এবং স্ট্রিং ইনডেক্সিং স্বরলিপি ব্যবহার করে অ্যাক্সেস করা যেতে পারে। এটি আপনাকে পুনরাবৃত্তিযোগ্য থেকে একটি পৃথক আইটেম বা আইটেমের পরিসর অ্যাক্সেস করতে দেয়।

নিম্নলিখিত কোড বিবেচনা করুন:

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

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

"TypeError:'function' অবজেক্ট সাবস্ক্রিপ্টযোগ্য নয়" ত্রুটি দেখা দেয় যখন আপনি একটি ফাংশন অ্যাক্সেস করার চেষ্টা করেন যেন এটি একটি পুনরাবৃত্তিযোগ্য বস্তু।

এই ত্রুটি দুটি পরিস্থিতিতে সাধারণ:

81% অংশগ্রহণকারী বলেছেন যে তারা বুটক্যাম্পে যোগ দেওয়ার পরে তাদের প্রযুক্তিগত কাজের সম্ভাবনা সম্পর্কে আরও আত্মবিশ্বাসী বোধ করেছেন। আজই একটি বুটক্যাম্পের সাথে মিলিত হন৷

গড় বুটক্যাম্প গ্র্যাড একটি বুটক্যাম্প শুরু করা থেকে শুরু করে তাদের প্রথম চাকরি খোঁজা পর্যন্ত ক্যারিয়ারের পরিবর্তনে ছয় মাসেরও কম সময় কাটিয়েছে।

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

আসুন এই উভয় পরিস্থিতি বিশ্লেষণ করি।

দৃশ্য #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"])

আমাদের কোড কনসোলে "শিক্ষার্থী" অভিধানে তিনটি মান প্রিন্ট করে। ছাত্র() ফাংশনে আর্গুমেন্ট হিসেবে "শিক্ষার্থী" অভিধানটি পাস করা হয়েছে।

আসুন আমাদের ফাংশনকে কল করি এবং একটি প্যারামিটার হিসাবে "ছাত্র" অভিধানটি পাস করি:

student(student)

আমাদের পাইথন কোড একটি ত্রুটি নিক্ষেপ করে:

Traceback (most recent call last):
  File "main.py", line 8, in <module>
	student(student)
  File "main.py", line 4, in student
	print("Name: " + pupil["name"])
TypeError: 'function' object is not subscriptable

এই ত্রুটির কারণ আমাদের একটি ফাংশন এবং একই নামের একটি পুনরাবৃত্তিযোগ্য। "ছাত্র" প্রথমে একটি অভিধান হিসাবে ঘোষণা করা হয়। আমরা তারপর একই নামের একটি ফাংশন সংজ্ঞায়িত. এটি একটি অভিধানের পরিবর্তে "ছাত্র" একটি ফাংশন করে তোলে।

যখন আমরা 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

ফাংশন "শিক্ষার্থী" নামে পরিচিত শিক্ষার্থীদের একটি তালিকা গ্রহণ করে। আমাদের ফাংশন একটি লুপ ব্যবহার করে সেই তালিকার উপর পুনরাবৃত্তি করে। যদি কোনো নির্দিষ্ট শিক্ষার্থী একটি "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 <module>
	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() তালিকা থেকে সূচক পজিশন 0 এ রেকর্ড পুনরুদ্ধার করতে আমরা ইন্ডেক্সিং ব্যবহার করি। ফাংশন রিটার্ন। অবশেষে, আমরা সেই রেকর্ডটি কনসোলে মুদ্রণ করি।

আসুন আমাদের কোডটি কার্যকর করি:

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

আমাদের কোড প্রথমে "A" গ্রেড অর্জনকারী সমস্ত ছাত্রদের একটি তালিকা প্রিন্ট করে। এরপরে, আমাদের কোড তালিকার প্রথম শিক্ষার্থীকে প্রিন্ট করে যে "A" গ্রেড পেয়েছে। এই ক্ষেত্রে সেই ছাত্র ছিলেন সামান্থা৷

উপসংহার

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

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

এখন আপনি পেশাদার কোডারের মতো এই সাধারণ পাইথন ত্রুটিটি সমাধান করতে প্রস্তুত!


  1. TypeError:'undefined' জাভাস্ক্রিপ্টে কোনো বস্তু নয়

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

  3. পাইথনে একটি ফাংশন থেকে একটি বস্তু কিভাবে ফেরত দিতে হয়?

  4. পাইথন ফাংশন থেকে কিভাবে একটি json অবজেক্ট ফিরিয়ে আনবেন?