खोज…


इंडेंटेशन त्रुटियां

अंतर सम और समरूप होना चाहिए। अनुचित इंडेंटेशन IndentationError पैदा कर सकता है या प्रोग्राम को कुछ अप्रत्याशित करने का कारण बन सकता है। निम्न उदाहरण एक IndentationError उठाता है:

a = 7
if a > 5:
  print "foo"
else:
  print "bar"
 print "done"

या यदि एक बृहदान्त्र का अनुसरण करने वाली रेखा इंडेंट नहीं है, तो एक IndentationError भी उठाया जाएगा:

if True:
print "true"

यदि आप इंडेंटेशन जोड़ते हैं, जहां यह नहीं है, तो IndentationError उठाया जाएगा:

if  True:
    a = 6
        b = 5

यदि आप अन-इंडेंट कार्यक्षमता को भूल जाते हैं तो खोया जा सकता है। इस उदाहरण में अपेक्षित False बजाय None लौटाया गया है:

def isEven(a):
    if a%2 ==0:
        return True
        #this next line should be even with the if
        return False
print isEven(7)

सरल उदाहरण है

पायथन के लिए, गुइडो वैन रोसुम ने इंडेंटेशन पर बयानों के समूह पर आधारित है। इसके कारणों को "डिजाइन एंड हिस्ट्री पायथन एफएक्यू" के पहले खंड में समझाया गया है । Colons, : , को एक इंडेंटेड कोड ब्लॉक घोषित करने के लिए उपयोग किया जाता है, जैसे कि निम्न उदाहरण:

class ExampleClass:
    #Every function belonging to a class must be indented equally
    def __init__(self):
        name = "example"

    def someFunction(self, a):
        #Notice everything belonging to a function must be indented
        if a > 5:
            return True
        else:
            return False

#If a function is not indented to the same level it will not be considers as part of the parent class
def separateFunction(b):
    for i in b:
    #Loops are also indented and nested conditions start a new indentation
        if i == 1:
            return True
    return False

separateFunction([2,3,5,6,1])

रिक्त स्थान या टैब?

अनुशंसित इंडेंटेशन 4 स्थान है लेकिन टैब या रिक्त स्थान इतने लंबे समय तक उपयोग किए जा सकते हैं जब तक वे सुसंगत हों। पाइथन में टैब और स्पेस को मिक्स न करें क्योंकि इससे पाइथन 3 में त्रुटि होगी और पाइथन 2 में त्रुटियाँ हो सकती हैं।

इंडेंटेशन कैसे पार्स किया जाता है

व्हॉट्सएप पार्स होने से पहले लेक्सिकल एनालाइजर द्वारा नियंत्रित किया जाता है।

लेक्सिकल विश्लेषक इंडेंटेशन स्तरों को संग्रहीत करने के लिए एक स्टैक का उपयोग करता है। शुरुआत में, स्टैक में केवल मान 0 होता है, जो सबसे बाईं स्थिति है। जब भी एक नेस्टेड ब्लॉक शुरू होता है, तो नए इंडेंटेशन स्तर को स्टैक पर धकेल दिया जाता है, और "इंडेंट" टोकन को टोकन स्ट्रीम में डाला जाता है जो पार्सर को पास किया जाता है। वहाँ कभी नहीं एक से अधिक "मांगपत्र" एक पंक्ति (में टोकन हो सकता है IndentationError )।

जब एक लाइन को छोटे इंडेंटेशन स्तर के साथ सामना किया जाता है, तो मान तब तक स्टैक से पॉपअप होते हैं जब तक कि कोई मूल्य शीर्ष पर नहीं होता है जो नए इंडेंटेशन स्तर के बराबर होता है (यदि कोई नहीं पाया जाता है, तो एक सिंटैक्स त्रुटि होती है)। प्रत्येक मान के लिए, एक "DEDENT" टोकन उत्पन्न होता है। जाहिर है, एक पंक्ति में कई "DEDENT" टोकन हो सकते हैं।

शाब्दिक विश्लेषक खाली रेखाओं को छोड़ देता है (जिनके केवल व्हाट्सएप और संभवतः टिप्पणियां हैं), और उनके लिए कभी भी "INDENT" या "DEDENT" टोकन उत्पन्न नहीं होगा।

स्रोत कोड के अंत में, स्टैक पर छोड़े गए प्रत्येक इंडेंटेशन स्तर के लिए "DEDENT" टोकन उत्पन्न होते हैं, जब तक कि केवल 0 शेष न हो।

उदाहरण के लिए:

if foo:
    if bar:
        x = 42
else:
    print foo

के रूप में विश्लेषण किया है:

<if> <foo> <:>                    [0]
<INDENT> <if> <bar> <:>           [0, 4]
<INDENT> <x> <=> <42>             [0, 4, 8]
<DEDENT> <DEDENT> <else> <:>      [0]
<INDENT> <print> <foo>            [0, 2]
<DEDENT> 

पार्सर की तुलना में "इंडेंट" और "डेडेंट" टोकन को ब्लॉक सीमांकक के रूप में संभालता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow