2016-05-22 3 views
1

Я читал PEP 8, но я не понимаю, почему Python3 пытается выделить смежные вкладки и пробелы с этим сообщением об ошибке.Почему возникает ошибка для смешивания вкладок и пробелов, но не для других нарушений PEP8?

TabError: inconsistent use of tabs and spaces in indentation

Я понимаю важность последовательности, но сообщение об ошибке, что останавливает выполнение кажется экстремальным, тем более, что смешанные и табуляции не имеют никакого значения для компилятора и наиболее хорошей поддержка редакторов преобразования вкладки/пространства. Кроме того, у Python3 нет проблем с тем, что вы игнорируете другие соглашения PEP (например, используя три пробела в пространстве вместо четырех), вы даже не получите для него предупреждающего сообщения.

Итак, в чем дело, почему Python3 все внезапно обрабатывает пространства смешивания и вкладки, такие как высшее зло?

+0

'тем более, что смешанные вкладки и пробелы не имеют никакого отношения к компилятору. - Из того, что я прочитал, компилятор полностью полагается на' \ t'. Другими пробелами являются несоответствия. – finnrayment

+0

Он не «останавливает исполнение» так, как отказывается выполнить. :) –

ответ

2

Вы можете прекрасно перемешать вкладки и пробелы в файле python (хотя PEP8 говорит, что не следует).

(Stackoverflow печатает вкладку в 4 пробела, пример вкладки являются правильными в this gist, проверить их самостоятельно!)

Вот отлично действует функция питона:

def foo(): 
    print("one tab") # all indentation is one tab. 
    if True: 
     print("two spaces") 
    else: 
     print("four spaces") 

, что вы не можете сделать вкладки смешивания и пространства в том же блоке:

def foo(): 
    print("one tab") 
     print("eight spaces") 

Это дает TabError.

Даже если они выстроились в текстовом редакторе.


Это потому, что (грубо говоря) они могут выстраиваться по-разному в чужом текстовом редакторе и посмотрите, как другую процедуру. Чтобы дать глупый пример:

def foo(): 
    while True: 
     "we should exit immediately" 
     return True # suppose this was tab indented 

Последняя строка может выглядеть, как она выстраивается со строкой, и, следовательно, возвращает сразу, но так как это вкладка с отступом, возможно, это выстроено с временем (так пока петля никогда не закрывается). ???

Здесь лежит двусмысленность, и поэтому парсер говорит «нет».


Однако PEP8 говорит, что вы должны всегда использовать только 4 пространства, избегая этой двусмысленности.

+1

Хорошо, я думаю, что вижу. Поэтому, если вы пишете смешанный код табуляции и пробелов, где табуляция - это 4 пробела, вы получите несоосность при вставке в редактор, где табуляция установлена ​​в 8 пробелов. Это может привести к молчаливой ошибке, которая погубит ваш день. Благодарю. – jmdeamer