Python Language
Vertiefung
Suche…
Einrückungsfehler
Der Abstand sollte überall gleich und gleichmäßig sein. Ein falscher Einzug kann einen IndentationError
verursachen oder bewirken, dass das Programm etwas Unerwartetes tut. Im folgenden Beispiel wird ein IndentationError
:
a = 7
if a > 5:
print "foo"
else:
print "bar"
print "done"
Wenn die Zeile nach einem Doppelpunkt nicht eingerückt ist, wird auch ein IndentationError
:
if True:
print "true"
Wenn Sie Einrückungen hinzufügen, an denen sie nicht gehören, wird ein IndentationError
:
if True:
a = 6
b = 5
Wenn Sie vergessen, den Einzug aufzuheben, kann die Funktionalität verloren gehen. In diesem Beispiel wird statt des erwarteten False
None
zurückgegeben:
def isEven(a):
if a%2 ==0:
return True
#this next line should be even with the if
return False
print isEven(7)
Einfaches Beispiel
Für Python hat Guido van Rossum die Gruppierung von Aussagen auf Einrückung vorgenommen. Die Gründe dafür werden im ersten Abschnitt der "FAQ zu Design und Historie Python" erläutert. Doppelpunkte, :
, werden verwendet , um einen eingerückten Codeblock zu deklarieren , wie im folgenden Beispiel:
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])
Leerzeichen oder Tabs?
Die empfohlene Einrückung besteht aus 4 Leerzeichen, aber Tabulatoren oder Leerzeichen können verwendet werden, solange sie konsistent sind. Mischen Sie keine Registerkarten und Leerzeichen in Python, da dies einen Fehler in Python 3 und in Python 2 Fehler verursachen kann.
Wie wird Einrückung analysiert?
Leerzeichen werden vom lexikalischen Analysator verarbeitet, bevor sie analysiert werden.
Der lexikalische Analysator verwendet einen Stapel zum Speichern von Eindruckebenen. Zu Beginn enthält der Stack nur den Wert 0, also die Position ganz links. Immer wenn ein verschachtelter Block beginnt, wird die neue Einrückungsebene in den Stapel verschoben, und ein Token "INDENT" wird in den Tokenstrom eingefügt, der an den Parser übergeben wird. Es kann niemals mehr als ein "INDENT" -Token in einer Zeile sein ( IndentationError
).
Wenn eine Zeile mit einer kleineren Einrückungsebene gefunden wird, werden die Werte aus dem Stapel entfernt, bis ein Wert oben angezeigt wird, der der neuen Einzugsebene entspricht (wenn keine gefunden wird, tritt ein Syntaxfehler auf). Für jeden gepoppten Wert wird ein "DEDENT" -Token generiert. Natürlich kann es mehrere "DEDENT" -Marker in einer Reihe geben.
Der lexikalische Analysator überspringt leere Zeilen (Zeilen, die nur Leerzeichen und möglicherweise Kommentare enthalten) und generiert niemals "INDENT" - oder "DEDENT" -Token für sie.
Am Ende des Quellcodes werden für jede auf dem Stapel verbleibende Einzugsebene "DEDENT" -Token generiert, bis nur noch die 0 übrig ist.
Zum Beispiel:
if foo:
if bar:
x = 42
else:
print foo
wird analysiert 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>
Der Parser behandelt dann die Token "INDENT" und "DEDENT" als Blockbegrenzer.