Поиск…


Ошибки отступов

Интервал должен быть четным и равномерным. Неправильное отступы могут вызвать IndentationError или заставить программу сделать что-то неожиданное. В следующем примере возникает параметр IndentationError :

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

Или, если строка, следующая за двоеточием, не имеет IndentationError будет также поднят параметр IndentationError :

if True:
print "true"

Если вы добавите отступ, где он не принадлежит, будет поднят параметр IndentationError :

if  True:
    a = 6
        b = 5

Если вы забудете отменить абзац, функции могут быть потеряны. В этом примере вместо ожидаемого False возвращается None :

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

Простой пример

Для Python Гвидо ван Россум основывал группировку высказываний на отступы. Причины этого объясняются в первом разделе «Часто задаваемые вопросы о дизайне и истории Python» . Colons, : , используются для объявления отступов кода , например, в следующем примере:

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

Пробелы или вкладки?

Рекомендуемый отступ - 4 пробела, но можно использовать вкладки или пробелы, если они совместимы. Не смешивайте вкладки и пробелы в Python, так как это вызовет ошибку в Python 3 и может вызвать ошибки в Python 2 .

Как отступы разобраны

Пробел обрабатывается лексическим анализатором перед анализом.

Лексический анализатор использует стек для хранения уровней отступов. В начале стек содержит только значение 0, которое является самым левым положением. Всякий раз, когда начинается вложенный блок, новый уровень отступов помещается в стек, а токен INDENT вставляется в поток токенов, который передается парсеру. В строке не может быть более одного «INDENT» токена ( IndentationError ).

Когда строка встречается с меньшим уровнем отступов, значения выводятся из стека до тех пор, пока значение не будет на вершине, которое равно новому уровню отступов (если ни один не найден, возникает синтаксическая ошибка). Для каждого значения выдается токен «DEDENT». Очевидно, что могут быть несколько токенов «DEDENT» подряд.

Лексический анализатор пропускает пустые строки (содержащие только пробелы и, возможно, комментарии), и никогда не будет генерировать для них токены «INDENT» или «DEDENT».

В конце исходного кода токены «DEDENT» генерируются для каждого уровня отступов, оставшегося в стеке, до тех пор, пока не останется только 0.

Например:

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

анализируется как:

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

Парсер, чем обрабатывает токены «INDENT» и «DEDENT» в качестве разделителей блоков.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow