Szukaj…


Błędy wcięcia

Odstępy powinny być równe i jednolite w całym tekście. Nieprawidłowe wcięcie może spowodować błąd IndentationError lub spowodować, że program zrobi coś nieoczekiwanego. Poniższy przykład przedstawia błąd IndentationError :

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

Lub jeśli linia po dwukropku nie jest wcięta, zostanie również podniesiony błąd IndentationError :

if True:
print "true"

Jeśli dodasz wcięcie tam, gdzie nie należy, zostanie wywołany błąd IndentationError :

if  True:
    a = 6
        b = 5

Jeśli zapomnisz, że funkcja wcięcia bez wcięcia może zostać utracona. W tym przykładzie None jest zwracany zamiast oczekiwanego False :

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

Prosty przykład

W przypadku Pythona Guido van Rossum oparł grupowanie zdań na wcięciach. Przyczyny tego wyjaśniono w pierwszej sekcji „Często zadawanych pytań dotyczących projektowania i historii Python” . Dwukropki : są używane do deklarowania wciętego bloku kodu , takiego jak następujący przykład:

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

Spacje czy tabulatory?

Zalecane wcięcie to 4 spacje, ale można używać tabulatorów lub spacji, o ile są one spójne. Nie mieszaj tabulatorów i spacji w Pythonie, ponieważ spowoduje to błąd w Pythonie 3 i może powodować błędy w Pythonie 2 .

Jak analizowane jest wcięcie

Przed sparsowaniem analizator leksykalny obsługuje białe znaki.

Analizator leksykalny używa stosu do przechowywania poziomów wcięć. Na początku stos zawiera tylko wartość 0, która jest pozycją najbardziej na lewo. Za każdym razem, gdy rozpoczyna się zagnieżdżony blok, nowy poziom wcięcia jest wypychany na stos, a token „INDENT” jest wstawiany do strumienia tokenu, który jest przekazywany do analizatora składni. Nigdy nie może być więcej niż jeden token „INDENT” w wierszu ( IndentationError ).

W przypadku napotkania linii o mniejszym poziomie wcięcia, wartości są wyskakujące ze stosu, aż na wierzchu pojawi się wartość równa nowemu poziomowi wcięcia (jeśli nie zostanie znaleziony, wystąpi błąd składniowy). Dla każdej podanej wartości generowany jest token „DEDENT”. Oczywiście może być wiele żetonów „DEDENT” z rzędu.

Analizator leksykalny pomija puste linie (te zawierające tylko białe znaki i ewentualnie komentarze) i nigdy nie wygeneruje dla nich ani tokenów „INDENT”, ani „DEDENT”.

Na końcu kodu źródłowego tokeny „DEDENT” są generowane dla każdego poziomu wcięcia pozostawionego na stosie, aż pozostanie tylko 0.

Na przykład:

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

jest analizowany jako:

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

Analizator składni niż obsługuje tokenów „INDENT” i „DEDENT” jako ograniczników bloków.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow