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

পাইথন TypeError: object of type ‘NoneType’ has no len() সমাধান

len() মেথড শুধু ইটারেবল অবজেক্ট যেমন স্ট্রিং, লিস্ট, এবং ডিকশনারির ওপর কাজ করে। এর কারণ হলো ইটারেবল অবজেক্ট ভ্যালুর সিকোয়েন্স ধারণ করে। আপনি যদি None ভ্যালুর ওপর len() মেথড ব্যবহার করার চেষ্টা করেন, আপনি "TypeError: object of type 'NoneType' has no len()" এরর সম্মুখীন হবেন।

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

TypeError: object of type 'NoneType' has no len()

NoneType রেফার করে None ডেটা টাইপকে। আপনি ইটারেবল অবজেক্টে কাজ করার মেথড, যেমন len(), None ভ্যালুর ওপর ব্যবহার করতে পারবেন না। এর কারণ হলো None কোনো ভ্যালুর কালেকশন ধারণ করে না। None-এর দৈর্ঘ্য ক্যালকুলেট করা যায় না কারণ None-এর কোনো চাইল্ড ভ্যালু নেই।

এই এরর সাধারণত দুটি কেসে হয়:

  • যেখানে আপনি ভুলে যান বিল্ট-ইন ফাংশন লিস্টকে ইন-প্লেস পরিবর্তন করে
  • যেখানে আপনি একটি ফাংশনে রিটার্ন স্টেটমেন্ট ভুলে যান

চলুন প্রতিটি কারণ গভীরে দেখি।

কারণ #১: বিল্ট-ইন ফাংশন লিস্টকে ইন-প্লেস পরিবর্তন করে

আমরা একটি প্রোগ্রাম বানাব যা একটি ডিকশনারির লিস্ট সর্ট করবে যেটি একটি স্কুলের ছাত্রদের ইনফরমেশন ধারণ করে। আমরা এই লিস্টটিকে আরোহী ক্রমে সর্ট করব ছাত্রদের শেষ টেস্টের গ্রেড অনুযায়ী।

শুরুতে, ছাত্রদের তথ্য এবং তাদের লেটেস্ট টেস্ট স্কোর ধারণকারী ডিকশনারির একটি লিস্ট ডিফাইন করি:

students = [
    {"name": "Peter", "score": 76 },
    {"name": "Richard", "score": 63 },
    {"name": "Erin", "score": 64 },
    {"name": "Miley", "score": 89 }
]

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

def score_sort(s):
    return s["score"]
sorted_students = students.sort(key=score_sort)

আমরা "score_sort" নামে একটি ফাংশন ডিক্লেয়ার করেছি যা প্রতিটি ডিকশনারিতে "score" এর ভ্যালু রিটার্ন করে। আমরা তারপর আমাদের ডিকশনারির লিস্টের আইটেম অর্ডার করতে এই sort() মেথড ব্যবহার করি।

এরপর, আমরা আমাদের লিস্টের দৈর্ঘ্য প্রিন্ট করি:

print("There are {} students in the list.".format(len(sorted_students)))

আমরা একটি for লুপ ব্যবহার করে ডিকশনারির নতুন লিস্ট কনসোলে প্রিন্ট করি:

for s in sorted_students:
    print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

এই কোড "sorted_students" লিস্টের প্রতিটি ছাত্রের জন্য তাদের শেষ টেস্টে কত মার্ক পেয়েছে তা জানাতে একটি মেসেজ প্রিন্ট করে। আমাদের কোড রান করি:

Traceback (most recent call last):
  File "main.py", line 13, in 
    print("There are {} students in the list.".format(len(sorted_students)))
TypeError: object of type 'NoneType' has no len()

আমাদের কোড একটি এরর রিটার্ন করে।

এই সমস্যা সমাধান করতে, আমাদের সেটি কোড রিমুভ করতে হবে যেখানে আমরা sort() মেথডের ফলাফল "sorted_students"-এ অ্যাসাইন করেছি। এর কারণ হলো sort() মেথড একটি লিস্টকে ইন-প্লেস পরিবর্তন করে। এটি একটি নতুন লিস্ট তৈরি করে না।

"sorted_students" লিস্টের ডিক্লেরেশন রিমুভ করি এবং বাকি প্রোগ্রামে "students" ব্যবহার করি:

students.sort(key=score_sort)
print("There are {} students in the list.".format(len(students)))
for s in students:
    print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

আমাদের কোড রান করি এবং দেখি কী হয়:

There are 4 students in the list.
Richard earned a score of 63 on their last test.
Erin earned a score of 64 on their last test.
Peter earned a score of 76 on their last test.
Miley earned a score of 89 on their last test.

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

কারণ #২: রিটার্ন স্টেটমেন্ট ভুলে যাওয়া

আমরা আমাদের কোড আরও মডুলার করব। এর জন্য, আমরা আমাদের সর্টিং মেথডকে তার নিজস্ব ফাংশনে সরিয়ে দিব। আমরা একটি ফাংশনও ডিফাইন করব যা প্রতিটি ছাত্রের টেস্ট স্কোর সম্পর্কে প্রিন্ট করে।

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

students = [
    {"name": "Peter", "score": 76 },
    {"name": "Richard", "score": 63 },
    {"name": "Erin", "score": 64 },
    {"name": "Miley", "score": 89 }
]
def score_sort(s):
    return s["score"]

এরপর, আমাদের লিস্ট সর্ট করার একটি ফাংশন লিখি:

def sort_list(students):
    students.sort(key=score_sort)

শেষে, আমরা প্রতিটি ছাত্রের পারফরম্যান্স সম্পর্কে ইনফরমেশন ডিসপ্লে করার একটি ফাংশন ডিফাইন করি:

def show_students(new_students):
    print("There are {} students in the list.".format(len(students)))
    for s in new_students:
        print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))

আমাদের কোড রান করার আগে, আমাদের ফাংশনগুলো কল করতে হবে:

new_students = sort_list(students)
show_students(new_students)

আমাদের প্রোগ্রাম প্রথমে sort_list() ফাংশন ব্যবহার করে আমাদের লিস্ট সর্ট করবে। তারপর, আমাদের প্রোগ্রাম প্রতিটি ছাত্র সম্পর্কে ইনফরমেশন কনসোলে প্রিন্ট করবে। এটি show_students() ফাংশনে হ্যান্ডেল করা হয়েছে।

আমাদের কোড রান করি:

Traceback (most recent call last):
  File "main.py", line 21, in 
    show_students(new_students)
  File "main.py", line 15, in show_students
    print("There are {} students in the list.".format(len(new_students)))
TypeError: object of type 'NoneType' has no len()

আমাদের কোড একটি এরর রিটার্ন করে। এই এরর ঘটেছে কারণ আমরা আমাদের "sort_list" ফাংশনে "return" স্টেটমেন্ট বুলে গেছি।

যখন আমরা sort_list() ফাংশন কল করি, আমরা এর রেসপন্স "new_students" ভ্যারিয়েবলে অ্যাসাইন করি। সেই ভ্যারিয়েবল আমাদের show_students() ফাংশনে পাস করা হয় যা প্রতিটি ছাত্রের ইনফরমেশন ডিসপ্লে করে। এই এরর সমাধান করতে, আমাদের sort_list() ফাংশনে একটি রিটার্ন স্টেটমেন্ট যোগ করতে হবে:

def sort_list(students):
    students.sort(key=score_sort)
    return students

আমাদের কোড রান করি:

There are 4 students in the list.
Richard earned a score of 63 on their last test.
Erin earned a score of 64 on their last test.
Peter earned a score of 76 on their last test.
Miley earned a score of 89 on their last test.

আমাদের কোড আশা করা রেসপন্স রিটার্ন করল।

উপসংহার

"TypeError: object of type 'NoneType' has no len()" এরর তখন হয় যখন আপনি len() মেথড এমন একটি অবজেক্টের ওপর ব্যবহার করার চেষ্টা করেন যার ভ্যালু None।

এই এরর সমাধান করতে, নিশ্চিত করুন যে আপনি কোনো বিল্ট-ইন লিস্ট মেথড, যেমন sort(), এর রেসপন্স কোনো ভ্যারিয়েবলে অ্যাসাইন করছেন না। যদি এটি এরর সমাধান না করে, নিশ্চিত করুন আপনার প্রোগ্রামে সফলভাবে ফাংশন করার জন্য সকল "return" স্টেটমেন্ট আছে।

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

  1. পাইথনে ডিকশনারি অবজেক্টকে স্ট্রিংএ রূপান্তর

  2. পাইথনে লিস্ট ডেটা টাইপ (List Data Type in Python)

  3. পাইথনে type() এবং isinstance() ফাংশন ব্যবহার করে অবজেক্ট টাইপ যাচাই

  4. পাইথন অবজেক্টের ভিতর কীভাবে ঝাঁকি দেবেন?