Zoeken…


Inspringfouten

De afstand moet overal gelijk en uniform zijn. Onjuiste inspringen kan een veroorzaken IndentationError of ervoor zorgen dat het programma om iets onverwachts te doen. Het volgende voorbeeld roept een IndentationError :

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

Of als de lijn na een dubbele punt niet is ingesprongen, wordt er ook een inspringfout IndentationError :

if True:
print "true"

Als u inspringing toevoegt waar het niet thuishoort, wordt een inspringingsfout IndentationError :

if  True:
    a = 6
        b = 5

Als u vergeet niet-inspringen functionaliteit kan verloren gaan. In dit voorbeeld wordt None geretourneerd in plaats van de verwachte False :

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

Eenvoudig voorbeeld

Voor Python baseerde Guido van Rossum de groepering van uitspraken op inspringen. De redenen hiervoor worden uitgelegd in het eerste gedeelte van de "Veelgestelde vragen over Python over ontwerp en geschiedenis" . Dubbele punten, : , worden gebruikt om een ingesprongen codeblok te declareren , zoals het volgende voorbeeld:

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])

Spaties of tabbladen?

De aanbevolen inspringing is 4 spaties, maar tabs of spaties kunnen worden gebruikt zolang ze consistent zijn. Gebruik geen tabs en spaties in Python, omdat dit een fout in Python 3 veroorzaakt en fouten in Python 2 kan veroorzaken.

Hoe inspringing is verdwenen

Witruimte wordt afgehandeld door de lexicale analyser voordat het wordt ontleed.

De lexicale analysator gebruikt een stapel om inspringingsniveaus op te slaan. In het begin bevat de stapel alleen de waarde 0, wat de meest linkse positie is. Wanneer een genest blok begint, wordt het nieuwe inspringniveau op de stapel gepusht en wordt een "INDENT" -token ingevoegd in de tokenstroom die wordt doorgegeven aan de parser. Er mag nooit meer dan één "INDENT" -token op rij zijn ( IndentationError ).

Wanneer een lijn met een kleiner inspringingsniveau wordt aangetroffen, worden waarden uit de stapel gehaald totdat een waarde bovenaan staat die gelijk is aan het nieuwe inspringingsniveau (als er geen wordt gevonden, treedt een syntaxisfout op). Voor elke popped-waarde wordt een "DEDENT" -token gegenereerd. Uiteraard kunnen er meerdere "DEDENT" tokens op een rij zijn.

De lexicale analysator slaat lege regels over (die alleen witruimte en mogelijk opmerkingen bevatten) en zal nooit "INDENT" of "DEDENT" tokens voor hen genereren.

Aan het einde van de broncode worden "DEDENT" -tokens gegenereerd voor elk inspringniveau dat nog op de stapel staat, totdat alleen de 0 overblijft.

Bijvoorbeeld:

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

wordt geanalyseerd als:

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

De parser verwerkt dan de "INDENT" en "DEDENT" tokens als blokafscheiders.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow