Python Language
вдавливание
Поиск…
Ошибки отступов
Интервал должен быть четным и равномерным. Неправильное отступы могут вызвать 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» в качестве разделителей блоков.