त्रुटिलेखन त्रुटि: ‘कोई नहीं’ ऑब्जेक्ट सबस्क्रिप्ट योग्य नहीं है पायथन में इसका मतलब है कि आपने किसी ऐसी चीज़ को अनुक्रमित या स्लाइस करने का प्रयास किया है जोNoneहै – जैसेresult[0] कबresult is None. यह सबसे आम पायथन त्रुटियों में से एक है। यहां हर कारण और समाधान है।
📋 Table of Contents
- "सदस्यता योग्य" का क्या मतलब है
- कारण 1: फ़ंक्शन स्पष्ट रूप से कोई नहीं लौटाता
- कारण 2: वह विधि जो इन-प्लेस रिटर्न को संशोधित करती है कोई नहीं
- कारण 3: dict.get() कोई नहीं लौटा रहा
- कारण 4: रेगेक्स मैच रिटर्निंग कोई नहीं
- कारण 5: एपीआई/डेटाबेस क्वेरी कोई नहीं लौटा रही
- डिबगिंग: पता लगाएं कि ऐसा क्यों नहीं है
- इसे रोकने के लिए सुरक्षित पैटर्न
- अक्सर पूछे जाने वाले प्रश्न
- निष्कर्ष
“सदस्यता योग्य” का क्या मतलब है
सबस्क्रिप्टिंग वर्गाकार कोष्ठक वाले तत्व तक पहुँचना है: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)
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: जब मैंने “कोई नहीं लौटाओ” नहीं लिखा तो मेरा फ़ंक्शन कोई नहीं क्यों लौटा रहा है?
उत्तर: यदि पाइथॉन फ़ंक्शंस बिना रिटर्न स्टेटमेंट के अंत तक पहुंचते हैं, या किसी ऐसे कोड पथ पर पहुंचते हैं जो वापस नहीं आता है, तो वे स्पष्ट रूप से कोई नहीं लौटाते हैं। एक सामान्य कारण: लूप के अंदर रिटर्न/यदि वह सभी इनपुट तक नहीं पहुंचता है।
प्रश्न: sorted_list = my_list.sort() कोई क्यों नहीं देता?
A: .sort() सूची को उसके स्थान पर क्रमबद्ध करता है और कोई नहीं लौटाता है।sorted(my_list)का प्रयोग करें जो एक नई क्रमबद्ध सूची लौटाता है। यह जाल कई इन-प्लेस तरीकों (संलग्न, रिवर्स, अपडेट) पर लागू होता है।
प्रश्न: मैं उन नेस्टेड डिक्ट कुंजियों तक सुरक्षित रूप से कैसे पहुंच सकता हूं जो गायब हो सकती हैं?
ए: चेन.get() डिफ़ॉल्ट के साथ:data.get('user', {}).get('name', 'unknown'). प्रत्येक .get() गायब होने पर एक खाली निर्देश लौटाता है, ताकि श्रृंखला किसी पर न पड़े।
प्रश्न: इसमें और ‘NoneType has noविशेषता’ के बीच क्या अंतर है?
ए: “नॉट सबस्क्रिप्टेबल”None[x]से है (वर्ग कोष्ठक)। “कोई विशेषता नहीं है”None.attrसे है (डॉट एक्सेस)। दोनों का मतलब है कि आपके पास कोई नहीं है जहां आपको वास्तविक वस्तु की उम्मीद थी – फिक्स (कोई नहीं के लिए जांच) वही है।
प्रश्न: क्या मुझे प्रयास/छोड़कर या यदि-चेक का उपयोग करना चाहिए?
ए: स्पष्ट पसंद करेंif x is not None जब कोई भी अपेक्षित संभावना न हो तो स्पष्टता की जाँच करता है। वास्तव में असाधारण मामलों के लिए प्रयास/छोड़कर का उपयोग करें। सामान्य “कुछ नहीं हो सकता” परिदृश्य के लिए जाँच करना अधिक स्पष्ट और तेज़ है।
निष्कर्ष
“‘NoneType’ ऑब्जेक्ट सबस्क्रिप्ट योग्य नहीं है” का अर्थ है कि आप किसी ऐसी चीज़ को अनुक्रमित कर रहे हैं जोNone. वास्तविक समाधान सबस्क्रिप्ट नहीं है – यह समझ हैआपका वेरिएबल कोई नहीं क्यों है: एक फ़ंक्शन जो स्पष्ट रूप से कोई नहीं लौटाता है, एक इन-प्लेस विधि जैसे.sort() जो कोई नहीं लौटाता है, एक अनुपलब्ध डिक्ट कुंजी, एक असफल रेगेक्स मिलान, या एक खाली क्वेरी परिणाम। एकprint(f"{result!r}")जोड़ें यह पुष्टि करने के लिए कि क्या कुछ नहीं है, उसके स्रोत का पता लगाएं, औरif x is not Noneसे सावधान रहें सदस्यता लेने से पहले. अपने कार्यों से सुसंगत प्रकार लौटाने से इनमें से अधिकांश त्रुटियों को पूरी तरह से रोका जा सकता है।
🔗 Share this article
✍️ Leave a Comment