🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

কিভাবে TypeError ঠিক করবেন NoneType অবজেক্ট পাইথনে সাবস্ক্রিপ্টযোগ্য নয়

⏱️3 min read  ·  488 words

ত্রুটিTypeError: ‘NoneType’ অবজেক্ট সাবস্ক্রিপ্টযোগ্য নয় পাইথনে মানে আপনি এমন কিছু সূচক বা টুকরো টুকরো করার চেষ্টা করেছেন যাNone — যেমনresult[0] যখনresult is None. এটি পাইথনের সবচেয়ে সাধারণ ত্রুটিগুলির মধ্যে একটি। এখানে প্রতিটি কারণ এবং ফিক্স আছে.

“সাবস্ক্রিপ্টযোগ্য” মানে কি

সাবস্ক্রিপটিং হল বর্গাকার বন্ধনী সহ একটি উপাদান অ্যাক্সেস করা:x[0], x['key'], x[1:3]. তালিকা, নির্দেশাবলী, স্ট্রিং এবং টিপল সাবস্ক্রিপ্টযোগ্য। None নয় — তাইNone[0] এই ত্রুটি উত্থাপন. আসল প্রশ্নটি সর্বদা:আপনার পরিবর্তনশীল কোনটি কেন?

কারণ 1: ফাংশন কিছুতেই প্রত্যাবর্তন করে না

# 🐛 Function has no return statement (or a path that doesn't return)
def find_user(users, name):
    for user in users:
        if user['name'] == name:
            return user
    # No return when not found → returns None implicitly

result = find_user(users, "Alice")
print(result['email'])   # ❌ TypeError if Alice not found (result is None)

# ✅ Check for None before subscripting
result = find_user(users, "Alice")
if result is not None:
    print(result['email'])
else:
    print("User not found")

কারণ 2: এমন পদ্ধতি যা ইন-প্লেস পরিবর্তন করে কোনোটি ফেরত দেয় না

# 🐛 list.sort() sorts in place and returns None
numbers = [3, 1, 2]
sorted_nums = numbers.sort()   # ❌ sort() returns None
print(sorted_nums[0])          # TypeError — sorted_nums is None

# ✅ Use sorted() which returns a new list
sorted_nums = sorted(numbers)  # returns a new sorted list
print(sorted_nums[0])          # works

# Same trap with: list.append(), list.reverse(), dict.update()
# These modify in place and return None

কারণ 3: dict.get() কোনটিই ফেরত দিচ্ছে না

# 🐛 .get() returns None for missing keys
config = {"host": "localhost"}
port = config.get("port")   # None — 'port' not in dict
print(port[0])              # ❌ TypeError

# ✅ Provide a default with .get()
port = config.get("port", 8080)   # default if missing

# ✅ Or check before use
port = config.get("port")
if port is not None:
    use(port)

কারণ 4: রেজেক্স ম্যাচ রিটার্নিং কোনটি নয়

import re

# 🐛 re.match/search return None when no match
match = re.search(r'\d+', "no numbers here")
number = match.group()   # ❌ TypeError — match is None

# ✅ Check the match first
match = re.search(r'\d+', text)
if match:
    number = match.group()
else:
    number = None

কারণ 5: এপিআই/ডাটাবেস কোয়েরি কোনোটিই ফেরত দিচ্ছে না

# 🐛 Database query returns None when no row found
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
name = user['name']   # ❌ TypeError if no user found

# ✅ Always handle the "not found" case
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
if user is None:
    raise NotFoundError(f"User {user_id} not found")
name = user['name']   # safe now

ডিবাগিং: কেন এটি কোনটি নয় তা খুঁজুন

# Add a check to see exactly what's None and where
result = some_function()
print(f"DEBUG: result = {result!r}, type = {type(result)}")
# If it prints "result = None", trace back to some_function()
# to find the code path that returns None

# Use a debugger to inspect
import pdb; pdb.set_trace()   # step through and check the value

এটি প্রতিরোধ করার জন্য নিরাপদ নিদর্শন

# Pattern 1: Walrus operator for check-and-use (Python 3.8+)
if (user := find_user(users, name)) is not None:
    print(user['email'])

# Pattern 2: Provide defaults
data = fetch_data() or {}   # empty dict if fetch returns None
value = data.get('key', 'default')

# Pattern 3: Optional chaining alternative (Python has no ?. operator)
name = user['name'] if user else None

# Pattern 4: Return consistent types from functions
def find_user(users, name):
    for user in users:
        if user['name'] == name:
            return user
    return {}   # return empty dict instead of None (if that makes sense)

প্রায়শই জিজ্ঞাসিত প্রশ্ন

প্রশ্নঃ কেন আমার ফাংশন None রিটার্ন করছে যখন আমি “রিটার্ন None” লিখিনি?
উত্তর: পাইথন ফাংশন রিটার্ন করে না যদি তারা রিটার্ন স্টেটমেন্ট ছাড়াই শেষ পর্যন্ত পৌঁছায়, অথবা কোনো কোড পাথে আঘাত করে যা রিটার্ন করে না। একটি সাধারণ কারণ: একটি লুপের ভিতরে একটি রিটার্ন/যদি এটি সমস্ত ইনপুটের জন্য না পৌঁছায়।

প্রশ্নঃ sorted_list = my_list.sort() None দেয় না কেন?
A: .sort() তালিকাকে জায়গায় সাজায় এবং কিছুই ফেরত দেয় না। ব্যবহার করুনsorted(my_list) যা একটি নতুন সাজানো তালিকা প্রদান করে। এই ফাঁদ অনেক ইন-প্লেস পদ্ধতিতে প্রযোজ্য (সংযোজন, বিপরীত, আপডেট)।

প্রশ্ন: আমি কীভাবে নিরাপদে নেস্টেড ডিক্ট কীগুলি অ্যাক্সেস করব যা অনুপস্থিত হতে পারে?
উঃ চেইন.get() ডিফল্ট সহ:data.get('user', {}).get('name', 'unknown'). অনুপস্থিত থাকলে প্রতিটি .get() একটি খালি ডিক্ট ফেরত দেয়, তাই চেইনটি কোনটিতে আঘাত না করে।

প্রশ্ন: এটি এবং ‘NoneType এর কোনো বৈশিষ্ট্য নেই’ এর মধ্যে পার্থক্য কী?
উত্তর: “সাবস্ক্রিপ্টযোগ্য নয়”None[x]থেকে এসেছে৷ (বর্গাকার বন্ধনী)। “কোন বৈশিষ্ট্য নেই”None.attrথেকে এসেছে৷ (ডট অ্যাক্সেস)। উভয়ের অর্থ হল আপনার কাছে একটি নেই যেখানে আপনি একটি বাস্তব বস্তুর প্রত্যাশা করেছিলেন — ফিক্স (কোনটি নয় চেক করুন) একই।

প্রশ্ন: আমার কি চেষ্টা/ব্যতীত বা যদি-চেক ব্যবহার করা উচিত?
উত্তর: স্পষ্টভাবে পছন্দ করুনif x is not None কোনটিই প্রত্যাশিত সম্ভাবনা না হলে স্পষ্টতার জন্য পরীক্ষা করে। সত্যিই ব্যতিক্রমী ক্ষেত্রে ব্যতীত চেষ্টা ব্যবহার করুন। সাধারণ “কোনও হতে পারে না” পরিস্থিতির জন্য পরীক্ষা করা আরও পরিষ্কার এবং দ্রুত।

উপসংহার

“‘NoneType’ অবজেক্ট সাবস্ক্রিপ্টযোগ্য নয়” মানে আপনি এমন কিছু ইন্ডেক্স করছেন যাNone. আসল সমাধান সাবস্ক্রিপ্ট নয় – এটি বোঝারকেন আপনার পরিবর্তনশীল কোনটি নয়: একটি ফাংশন প্রত্যাবর্তন করে কোনটি নিহিত নয়, একটি ইন-প্লেস পদ্ধতি যেমন.sort() যা কোনটিই দেয় না, একটি অনুপস্থিত ডিক্ট কী, একটি ব্যর্থ রেজেক্স ম্যাচ, বা একটি খালি ক্যোয়ারী ফলাফল। একটি যোগ করুনprint(f"{result!r}") কোনটি নেই তা নিশ্চিত করতে, এর উত্সে ফিরে যান এবংif x is not Noneদিয়ে রক্ষা করুন৷ সাবস্ক্রিপশন করার আগে। আপনার ফাংশন থেকে সামঞ্জস্যপূর্ণ প্রকারগুলি ফিরিয়ে দেওয়া এই ত্রুটিগুলির বেশিরভাগ সম্পূর্ণরূপে প্রতিরোধ করে৷

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা