Python Language
राष्ट्रमंडल अपवाद
खोज…
परिचय
यहां स्टैक ओवरफ्लो में हम अक्सर डुप्लिकेट को उसी त्रुटियों के बारे में बात करते हुए देखते हैं: "ImportError: No module named '??????'
, SyntaxError: invalid syntax
या NameError: name '???' is not defined
। यह उन्हें कम करने और लिंक करने के लिए कुछ दस्तावेज़ीकरण करने का प्रयास है।
इंडेंटेशन एरर्स (या इंडेंटेशन सिंटेक्स एरर्स)
अधिकांश अन्य भाषाओं में इंडेंटेशन अनिवार्य नहीं है, लेकिन पायथन (और अन्य भाषाओं में: फोरट्रान, मेकफाइल्स, व्हॉट्सस्पेस (गूढ़ भाषा), आदि के शुरुआती संस्करण) यह मामला नहीं है, अगर आप दूसरी भाषा से आते हैं, तो क्या भ्रमित हो सकता है यदि आप एक उदाहरण से अपने खुद के लिए कोड कॉपी कर रहे थे, या बस अगर आप नए हैं।
IndentationError / SyntaxError: अप्रत्याशित इंडेंट
यह अपवाद तब उठाया जाता है जब बिना किसी कारण के इंडेंटेशन स्तर बढ़ जाता है।
उदाहरण
यहाँ स्तर बढ़ाने का कोई कारण नहीं है:
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
यहां दो त्रुटियां हैं: अंतिम एक और यह कि इंडेंटेशन किसी इंडेंटेशन स्तर से मेल नहीं खाता है। हालाँकि सिर्फ एक दिखाया गया है:
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
IndentationError / SyntaxError: unindent किसी भी बाहरी indentation level से मेल नहीं खाता है
लगता है कि आप पूरी तरह से एकमत नहीं थे।
उदाहरण
def foo():
print "This should be part of foo()"
print "ERROR!"
print "This is not a part of foo()"
print("This line is ok")
print("This line isn't ok")
अभिस्थापन त्रुटि: किसी अभिस्थापन अवरोध की संभावना
एक बृहदान्त्र (और फिर एक नई लाइन) के बाद इंडेंटेशन स्तर बढ़ाना पड़ता है। यह त्रुटि तब होती है जब ऐसा नहीं हुआ।
उदाहरण
if ok:
doStuff()
नोट : कीवर्ड pass
उपयोग करें (जो पूरी तरह से कुछ भी नहीं करता है) बस एक if
, else
, except
, class
, method
या definition
method
, लेकिन यह नहीं कहेंगे कि क्या होगा यदि कॉल / स्थिति सही है (लेकिन बाद में, या मामले में करें) except
: बस कुछ नहीं):
def foo():
pass
IndentationError: इंडेंटेशन में टैब और रिक्त स्थान का असंगत उपयोग
उदाहरण
def foo():
if ok:
return "Two != Four != Tab"
return "i dont care i do whatever i want"
इस त्रुटि से कैसे बचें
टैब का उपयोग न करें। यह PEP8
, पायथन के लिए स्टाइल गाइड द्वारा हतोत्साहित किया गया है।
- इंडेंटेशन के लिए 4 रिक्त स्थान का उपयोग करने के लिए अपने संपादक को सेट करें।
- एक खोज करें और 4 टैब के साथ सभी टैब को बदलने के लिए बदलें।
- सुनिश्चित करें कि आपका संपादक 8 स्थानों के रूप में टैब प्रदर्शित करने के लिए सेट है, ताकि आप आसानी से उस त्रुटि को महसूस कर सकें और उसे ठीक कर सकें।
यदि आप अधिक सीखना चाहते हैं तो इस प्रश्न को देखें।
TypeErrors
ये अपवाद तब होते हैं जब किसी वस्तु का प्रकार अलग होना चाहिए
TypeError: [परिभाषा / विधि] लेता है? स्थैतिक तर्क लेकिन दिया गया था
एक फ़ंक्शन या विधि को उन लोगों की तुलना में अधिक (या कम) तर्कों के साथ बुलाया गया था जो इसे स्वीकार कर सकते हैं।
उदाहरण
यदि अधिक तर्क दिए जाते हैं:
def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined
यदि कम तर्क दिए जाते हैं:
def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined
नोट : यदि आप अज्ञात संख्या में तर्कों का उपयोग करना चाहते हैं, तो आप *args
या **kwargs
उपयोग कर सकते हैं। देखें * आर्ग्स और ** क्वार्ग्स
TypeError: असमर्थित ऑपरेंड प्रकार (ओं) के लिए [operand]: '???' तथा '???'
ऑपरेंड के आधार पर कुछ प्रकारों को एक साथ संचालित नहीं किया जा सकता है।
उदाहरण
उदाहरण के लिए: +
का उपयोग संक्षिप्त और जोड़ने के लिए किया जाता है, लेकिन आप दोनों प्रकारों में से किसी का भी उपयोग नहीं कर सकते। उदाहरण के लिए, एक बनाने की कोशिश कर set
श्रृंखलाबद्ध (द्वारा +
ing) 'set1'
और 'tuple1'
त्रुटि देता है। कोड:
set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1
कुछ प्रकार (जैसे: int
और string
) दोनों का उपयोग +
लेकिन अलग-अलग चीजों के लिए:
b = 400 + 'foo'
या उनका उपयोग किसी चीज़ के लिए भी नहीं किया जा सकता है:
c = ["a","b"] - [1,2]
लेकिन आप उदाहरण के लिए एक int
एक float
जोड़ सकते हैं:
d = 1 + 1.0
त्रुटि प्रकार: '???' ऑब्जेक्ट iterable / subscriptable नहीं है:
एक वस्तु iterable होने के लिए यह शून्य से शुरू अनुक्रमिक अनुक्रमित ले जा सकते हैं जब तक अनुक्रमित अब मान्य नहीं हैं और एक IndexError
उठाया है (अधिक तकनीकी रूप से: यह एक होना आवश्यक है __iter__
विधि है जो एक रिटर्न __iterator__
, या जो एक को परिभाषित करता है __getitem__
विधि है कि करता है जो पहले बताया गया था)।
उदाहरण
यहाँ हम कह रहे हैं कि bar
का शून्य आइटम है। बकवास:
foo = 1
bar = foo[0]
यह एक अधिक असतत संस्करण है: इस उदाहरण के for
x
को amount[0]
सेट करने की कोशिश करता है amount[0]
, एक पुनरावृत्त में पहला आइटम लेकिन यह नहीं हो सकता क्योंकि राशि एक int है:
amount = 10
for x in amount: print(x)
त्रुटि प्रकार: '???' वस्तु कॉल करने योग्य नहीं है
आप एक चर को परिभाषित कर रहे हैं और इसे बाद में कॉल कर रहे हैं (जैसे आप किसी फ़ंक्शन या विधि के साथ क्या करते हैं)
उदाहरण
foo = "notAFunction"
foo()
NameError: नाम '???' परिभाषित नहीं है
तब उठाया जाता है जब आपने एक चर, विधि या फ़ंक्शन का उपयोग करने की कोशिश की है जो कि आरंभीकृत नहीं है (कम से कम पहले नहीं)। दूसरे शब्दों में, यह तब उठाया जाता है जब एक अनुरोधित स्थानीय या वैश्विक नाम नहीं मिलता है। यह संभव है कि आप वस्तु के नाम को भूल गए या कुछ import
करना भूल गए। इसके अलावा शायद यह एक और दायरे में है। हम उन्हें अलग-अलग उदाहरणों से कवर करेंगे।
यह कोड में कहीं भी परिभाषित नहीं है
यह संभव है कि आप इसे शुरू करना भूल गए, खासकर अगर यह एक स्थिर है
foo # This variable is not defined
bar() # This function is not defined
शायद यह बाद में परिभाषित किया गया है:
baz()
def baz():
pass
या यह एड import
नहीं था:
#needs import math
def sqrt():
x = float(input("Value: "))
return math.sqrt(x)
पायथन स्कोप और लेग नियम:
तथाकथित लेग नियम नियम पाइथन स्कोप के बारे में बात करता है। यह नाम विभिन्न प्राथमिकताओं पर आधारित है, जो संवाददाता प्राथमिकताओं द्वारा आदेशित है:
Local → Enclosed → Global → Built-in.
- एल ocal: चर एक समारोह में वैश्विक या सौंपा नहीं घोषित किया।
- ई nclosing: चर एक फ़ंक्शन में परिभाषित किया गया है जो किसी अन्य फ़ंक्शन के अंदर लपेटा जाता है।
- जी लोबाल: चर को वैश्विक घोषित किया गया, या किसी फ़ाइल के शीर्ष-स्तर पर सौंपा गया।
- B uilt-in: वेरिएबल्स को अंतर्निहित नाम मॉड्यूल में रखा गया है।
उदाहरण के तौर पे:
for i in range(4):
d = i * 2
print(d)
d
संवेदी है क्योंकि लूप के for
कोई नया स्कोप नहीं है, लेकिन अगर ऐसा हुआ, तो हमें एक त्रुटि होगी और इसका व्यवहार निम्न के जैसा होगा:
def noaccess():
for i in range(4):
d = i * 2
noaccess()
print(d)
पायथन कहते हैं NameError: name 'd' is not defined
अन्य त्रुटियां
AssertError
assert
वक्तव्य लगभग हर प्रोग्रामिंग भाषा में मौजूद है। जब तुम करोगे:
assert condition
या:
assert condition, message
यह इसके बराबर है:
if __debug__:
if not condition: raise AssertionError(message)
निबंध में एक वैकल्पिक संदेश शामिल हो सकता है, और जब आप डीबगिंग कर लेते हैं, तो आप उन्हें अक्षम कर सकते हैं।
नोट : बिल्ट-इन वैरिएबल डिबग सामान्य परिस्थितियों में सही है, ऑप्टिमाइज़ेशन का अनुरोध करने पर गलत (कमांड लाइन विकल्प -ओ)। डिबग करने के लिए असाइनमेंट अवैध हैं। इंटरप्रेटर शुरू होने पर अंतर्निहित चर के लिए मूल्य निर्धारित किया जाता है।
KeyboardInterrupt
उपयोगकर्ता द्वारा बाधा कुंजी दबाए जाने पर त्रुटि, सामान्य रूप से Ctrl + C या डेल ।
ZeroDivisionError
आपने 1/0
की गणना करने की कोशिश की जो अपरिभाषित है। संख्या के विभाजकों को खोजने के लिए यह उदाहरण देखें:
div = float(raw_input("Divisors of: "))
for x in xrange(div+1): #includes the number itself and zero
if div/x == div//x:
print x, "is a divisor of", div
div = int(input("Divisors of: "))
for x in range(div+1): #includes the number itself and zero
if div/x == div//x:
print(x, "is a divisor of", div)
इससे उठाती ZeroDivisionError
क्योंकि for
करने के लिए लूप प्रदान करती है कि मूल्य x
। इसके बजाय यह होना चाहिए:
div = float(raw_input("Divisors of: "))
for x in xrange(1,div+1): #includes the number itself but not zero
if div/x == div//x:
print x, "is a divisor of", div
div = int(input("Divisors of: "))
for x in range(1,div+1): #includes the number itself but not zero
if div/x == div//x:
print(x, "is a divisor of", div)
अच्छे कोड पर सिंटैक्स त्रुटि
समय का सकल बहुमत एक SyntaxError जो एक निर्बाध रेखा को इंगित करता है इसका मतलब है कि इससे पहले लाइन पर एक मुद्दा है (इस उदाहरण में, यह एक लापता कोष्ठक है):
def my_print():
x = (1 + 1
print(x)
रिटर्न
File "<input>", line 3
print(x)
^
SyntaxError: invalid syntax
इस मुद्दे का सबसे आम कारण बेमेल कोष्ठक / कोष्ठक हैं, जैसा कि उदाहरण से पता चलता है।
पायथन 3 में प्रिंट स्टेटमेंट के लिए एक प्रमुख चेतावनी है:
>>> print "hello world"
File "<stdin>", line 1
print "hello world"
^
SyntaxError: invalid syntax
क्योंकि print
स्टेटमेंट को print()
फ़ंक्शन से बदल दिया गया था , इसलिए आप चाहते हैं:
print("hello world") # Note this is valid for both Py2 & Py3