Python Language
Indrag
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.