পাইথন মডিউল বিভ্রান্তিকর, বিশেষ করে যখন আপনি নিজের ডিফাইন করেন। "TypeError: 'module' object is not callable" পাইথন ডেভেলপাররা ক্লাস নিয়ে কাজ করার সময় করার সবচেয়ে সাধারণ ভুলগুলোর একটি।
এই গাইডে, আমরা এই এররটি কী বোঝায় এবং কেন এটি উঠে সেটি আলোচনা করব। আমরা একটি উদাহরণ কোড স্নিপেটের মাধ্যমে যাব যাতে আপনি এই এররটি অতিক্রম করতে পারেন। চলুন শুরু করি!
সমস্যাটি: TypeError: 'module' object is not callable
যেকোনো পাইথন ফাইল একটি মডিউল যতক্ষণ না এটি ".py" এক্সটেনশন দিয়ে শেষ হয়।
মডিউলগুলো পাইথনে অত্যন্ত গুরুত্বপূর্ণ কারণ সেগুলো আপনাকে ফাংশন, ভেরিয়েবল, এবং ক্লাস একটি মেইন প্রোগ্রামের বাইরে ডিফাইন করতে দেয়। এর মানে আপনি আপনার কোডকে একাধিক ফাইলে ভাগ করতে পারেন এবং এটি আরও কার্যকরভাবে ক্যাটাগরাইজ করতে পারেন।
মডিউলগুলো একটি নির্দিষ্টভাবে ইম্পোর্ট করা উচিত। অন্যথায়, পাইথন একটি এরর রিটার্ন করে:
TypeError: 'module' object is not callable
এটি ঘটে যখন আপনি একটি মডিউলকে একটি ফাংশন হিসেবে ইম্পোর্ট করার চেষ্টা করেন।
একটি উদাহরণ সিনেরিও
"cakes" নামে একটি মডিউল ডিফাইন করি। এই মডিউলে একটি ফাংশন আছে: read_file। read_file ফাংশনটি একটি টেক্সট ফাইলের কন্টেন্ট পড়ে।
আমাদের ফাইলনেম আমাদের মডিউলের নাম নির্ধারণ করে। কারণ আমরা আমাদের মডিউলকে "cakes" বলতে চাই, আমরা আমাদের কোড cakes.py নামে একটি ফাইলে লিখব:
def read_file():
all_cakes = []
with open("cakes.txt", "r") as cake_file:
cake_list = cake_file.readlines()
for c in cake_list:
all_cakes.append(c.replace("\n", ""))
return all_cakes
এই ফাংশনটি "cakes.txt" নামে একটি ফাইলের কন্টেন্ট পড়ে। তারপর এটি ফাইলের প্রতিটি টেক্সট লাইন এর মাধ্যমে ইটারেট করে এবং প্রতিটি লাইনকে "all_cakes" নামে একটি লিস্টে অ্যাড করে।
replace() মেথডটি যেকোনো নিউ লাইন ("\n") ক্যারেক্টারকে একটি খালি ভ্যালুর সাথে রিপ্লেস করতে ব্যবহৃত হয়। এটি সব নিউ লাইন রিমুভ করে। আমরা আমাদের ফাংশনের শেষে "all_cakes" রিটার্ন করি।
এখন, app.py নামে একটি ফাইল খুলুন এবং এই কোডটি পেস্ট করুন:
import cakes cake_list = cakes() print(cake_list)
এই কোডটি আমাদের "cakes" মডিউল ব্যবহার করে "cakes.txt" ফাইলের কন্টেন্ট পড়ে। তারপর এটি ফাংশনটি ফাইলে পাওয়া সব কেক প্রিন্ট আউট করে।
চলুন আমাদের কোড রান করি:
Traceback (most recent call last): File "main.py", line 3, incakes = cakes() TypeError: 'module' object is not callable
আমাদের কোড একটি এরর রিটার্ন করে।
সমাধান
চলুন আমাদের app.py ফাইলে ইম্পোর্ট স্টেটমেন্টটি দেখি:
import cakes
আমরা "cakes" মডিউলটি ইম্পোর্ট করি। এতে "cakes.py" ফাইলে আমরা যা ডিক্লেয়ার করেছি সে সকল ভেরিয়েবল, ক্লাস, এবং ফাংশন থাকে।
এখন, চলুন আমাদের পরবর্তী লাইনের কোডটি দেখি:
cake_list = cakes()
যদিও "cakes" মডিউলে শুধু একটি ফাংশন থাকে, আমরা সেটি স্পেসিফাই করিনি যে ফাংশনটি কোনটি। এটি পাইথনকে বিভ্রান্ত করে কারণ এটি জানতে পারে না কোন ফাংশন এর সাথে কাজ করা উচিত।
এই এররটি সমাধান করতে, আমরা মডিউলটির নামের বদলে আমরা যে ফাংশনটি রেফারেন্স করতে চাই তার নাম কল করি:
import cakes cake_list = cakes.read_file() print(cake_list)
আবার আমাদের কোড রান করি:
['Cinnamon Babka', 'Chocolate Cupcake']
আমাদের কোড সফলভাবে কেকের লিস্ট রিটার্ন করে।
আমাদের app.py ফাইলে, আমরা cakes.read_file() কল করি।
পাইথন "cakes.py" ফাইলটি দেখে যেখানে আমাদের "cakes" মডিউল স্টোর করা আছে এবং read_file() ফাংশনটি লোকেট করে। তারপর, পাইথন সেই ফাংশনটি এক্সিকিউট করে।
আমরা read_file() ফাংশনের রেজাল্টকে "cake_list" নামে একটি ভেরিয়েবলে অ্যাসাইন করি। তারপর, আমরা সেই লিস্টকে কনসোলে প্রিন্ট আউট করি।
বিকল্পভাবে, read_file ফাংশনটি সরাসরি আমাদের প্রোগ্রামে ইম্পোর্ট করি:
from cakes import read_file cake_list = read_file() print(cake_list)
আমাদের কোড রিটার্ন করে:
['Cinnamon Babka', 'Chocolate Cupcake']
আমাদের কোড "cakes" মডিউল থেকে read_file() ফাংশন এক্সিকিউট করে। এই উদাহরণে, আমরা পুরো "cakes" মডিউল ইম্পোর্ট করি। সেটি করার বদলে, আমরা "cakes" মডিউল থেকে একটি ফাংশন ইম্পোর্ট করি: read_file।
লক্ষ্য করুন যখন আমরা read_file ইম্পোর্ট করি, আমাদের আর cakes.read_file() ব্যবহার করে আমাদের ফাংশন কল করতে হয় না। আমরা read_file() ব্যবহার করি কারণ আমরা read_file() ফাংশনটি সরাসরি আমাদের কোডে ইম্পোর্ট করেছি।
উপসংহার
একটি পাইথন মডিউলের কোড একটি ভিন্ন ফাইলে থাকে। মডিউল থেকে ফাংশন এবং ভ্যালু ইম্পোর্ট করার কিছু ভিন্ন উপায় আছে এবং এটা গুলিয়ে ফেলা সহজ।
আপনি মডিউলের সাথে কাজ করার সময়, নিশ্চিত করুন যে আপনি যেসব ফাংশন, ক্লাস, এবং ভেরিয়েবল অ্যাক্সেস করতে চান সেগুলো সঠিকভাবে রেফারেন্স করছেন। আপনাকে সেই এক্স্যাক্ট ফাংশনটি স্পেসিফাই করতে হবে যা আপনি একটি মডিউল থেকে কল করতে চান যদি আপনি একটি ফাংশন রেফারেন্স করতে চান, মডিউলটি নিজে কল করার বদলে।
এখন আপনি এই পাইথন TypeError প্রফেশনাল ডেভেলপারের মতো সমাধান করার জন্য রেডি!