পাইথন মেথডে আর্গুমেন্ট প্যারেনথেসিস দিয়ে স্পেসিফাই করতে হয়। এর কারণ হলো ফাংশন এবং মেথড উভয় প্যারেনথেসিস ব্যবহার করে বোঝায় সেগুলো কল হচ্ছে। আপনি যদি স্কোয়ার ব্র্যাকেট ব্যবহার করে মেথড কল করেন, আপনি "TypeError: 'method' object is not subscriptable" এরর সম্মুখীন হবেন।
এই গাইডে, আমরা এই এরর কী বোঝায় এবং কেন আপনি এতে সম্মুখীন হতে পারেন তা আলোচনা করব। আমরা এই এররটির একটি উদাহরণ দিয়ে ওয়াকথ্রু করব যাতে আপনি সমাধান ডেভেলপ করতে পারেন।
TypeError: 'method' object is not subscriptable
সাবস্ক্রিপ্টেবল অবজেক্ট হলো যেসব অবজেক্টের __getitem__ মেথড রয়েছে। এগুলো হলো লিস্ট, ডিকশনারি, এবং টাপল जैसे ডেটা টাইপ। __getitem__ মেথড পাইথন ইন্টারপ্রেটারকে একটি কালেকশন থেকে পৃথক আইটেম রিট্রিভ করতে দেয়।
সব অবজেক্ট সাবস্ক্রিপ্টেবল নয়। মেথড, উদাহরণস্বরূপ, নয়। এর কারণ হলো সেগুলো __getitem__ মেথড ইমপ্লিমেন্ট করে না। এর মানে আপনি স্কোয়ার ব্র্যাকেট সিনট্যাক্স ব্যবহার করে মেথডের আইটেম অ্যাক্সেস করতে বা মেথড কল করতে পারবেন না।
নিচের কোড স্নিপেট বিবেচনা করুন:
cheeses = ["Edam", "Stilton", "English Cheddar", "Parmesan"] print(cheeses[0])
এই কোড "Edam" রিটার্ন করে, ইনডেক্স পজিশন ০-এ থাকা চিজটি। আমরা ফাংশন বা মেথড কল করতে স্কোয়ার ব্র্যাকেট ব্যবহার করতে পারি না কারণ ফাংশন এবং মেথড সাবস্ক্রিপ্টেবল অবজেক্ট নয়।
একটি উদাহরণ সিনেরিও
এখানে, আমরা একটি প্রোগ্রাম বানাব যা চিজ অবজেক্টে সংরক্ষণ করে। আমরা যে "Cheese" ক্লাস ব্যবহার করব চিজ ডিফাইন করতে, সেটিতে একটি মেথড থাকবে যা আমাদের চেক করতে দেবে চিজটি একটি নির্দিষ্ট কান্ট্রি অফ অরিজিন থেকে কিনা।
আমাদের চিজের জন্য একটি ক্লাস ডিফাইন করি। আমরা এই ক্লাসকে 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 এবং এর কান্ট্রি অফ অরিজিন নেদারল্যান্ডস।
এখন, আমাদের 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" এরর তখন আরাইজ হয় যখন আপনি একটি ক্লাসের ভিতরে মেথড কল করতে স্কোয়ার ব্র্যাকেট ব্যবহার করেন। এই এরর সমাধান করতে, নিশ্চিত করুন যে আপনি একটি ক্লাসের মেথড শুধু কার্লি ব্র্যাকেট ব্যবহার করে কল করছেন মেথডের নামের পরে।
এখন আপনি এই কমন পাইথন এরর প্রফেশনাল কোডারের মত সমাধান করার জন্য প্রস্তুত!