Sök…


Indragningsfel

Avståndet ska vara jämnt och jämnt genomgående. Felaktig intryck kan orsaka en IndentationError eller göra att programmet gör något oväntat. Följande exempel höjer en IndentationError :

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

Eller om linjen efter en kolon inte är indragad kommer en IndentationError att höjas:

if True:
print "true"

Om du lägger till intryck där det inte hör till kommer en IndentationError att höjas:

if  True:
    a = 6
        b = 5

Om du glömmer att avmarkera funktionaliteten kan förloras. I detta exempel returneras None istället för det förväntade False :

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

Enkelt exempel

För Python baserade Guido van Rossum gruppering av uttalanden på intryck. Orsakerna till detta förklaras i det första avsnittet i "Design and History Python FAQ" . Kolon, : , används för att förklara ett intryckt kodblock , till exempel följande exempel:

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

Mellanslag eller flikar?

Den rekommenderade indragningen är 4 mellanslag men flikar eller mellanslag kan användas så länge de är konsekventa. Blanda inte flikar och mellanslag i Python eftersom det kan orsaka fel i Python 3 och kan orsaka fel i Python 2 .

Hur indragning är analyserad

Whitespace hanteras av den leksikaliska analysatorn innan den analyseras.

Den leksikala analysatorn använder en stack för att lagra intryckningsnivåer. I början innehåller stacken bara värdet 0, som är det längst till vänster. Närhelst ett kapslat block startas skjuts den nya indragningsnivån på bunten, och ett "INDENT" -token sätts in i tokenströmmen som skickas till tolkaren. Det kan aldrig finnas mer än ett "INDENT" -tecken i rad ( IndentationError ).

När en rad möts med en mindre indragningsnivå poppas värden från bunten tills ett värde är uppe som är lika med den nya indragningsnivån (om ingen finns, uppstår ett syntaxfel). För varje poppat värde genereras ett "DEDENT" -token. Uppenbarligen kan det finnas flera "DEDENT" -tecken i rad.

Den leksikala analysatorn hoppar över tomma rader (de som endast innehåller blanksteg och eventuellt kommentarer) och kommer aldrig att generera varken "INDENT" eller "DEDENT" -tecken för dem.

I slutet av källkoden genereras "DEDENT" -tecken för varje intryckningsnivå kvar på bunten tills bara 0 är kvar.

Till exempel:

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

analyseras som:

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

Tolkaren än hanterar symbolerna "INDENT" och "DEDENT" som blockavgränsare.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow