Интерпретация Python вкладок и пробелов для отступа

Я решил, что я узнаю немного Python. В первом введении говорится, что он использует отступы для групповых операторов. Хотя лучшая привычка-использовать только один из них, что произойдет, если я обменяю их? Сколько пробелов будет считаться равным одной вкладке? Или он вообще не будет работать, если вкладки и пробелы смешаны?

7 ответов


пробелы не рассматриваются как эквивалент tab. Строка с отступом с вкладкой находится в другом отступе от строки с отступом 1, 2, 4 или 8 пробелы.

доказательство встречным примером (ошибочный, или, в лучшем случае, ограниченный - tab != 4 пробела):

x = 1
if x == 1:
^Iprint "fff\n"
    print "yyy\n"

в '^I на TAB. При запуске через Python 2.5 я получаю сообщение об ошибке:

  File "xx.py", line 4
    print "yyy\n"
                ^
IndentationError: unindent does not match any outer indentation level

таким образом, показывая, что в Python 2.5 вкладки не равны пробелам (и, в частности, не равно 4 места).


Oops-неловко; мое доказательство контрпримером показывает, что вкладки не эквивалентны 4 пробелам. As Алекс Мартелли в комментарий, в Python 2 вкладки эквивалентны 8 пробелам, и адаптация примера с вкладкой и 8 пробелами показывает, что это действительно так.

x = 1
if x != 1:
^Iprint "x is not 1\n"
        print "y is unset\n"

в Python 2 этот код работает, ничего не печатая.


в Python 3, правила немного отличаются (as отметить by Антти Хаапала). Сравнить:

Python 2 говорит:

во-первых, вкладки заменяются (слева направо) от одного до восьми пробелов, так что общее количество символов до и включая замену кратно восьми (это должно быть то же правило, что и в Unix). Общее количество пробелов, предшествующих первому непустому символу, определяет отступ строки. Отступ не может быть разделен на несколько физических линий с помощью обратной косой черты; пробелы до первой обратной косой черты определяет отступ.

Python 3 говорит:

вкладки заменяются (слева направо) на один-восемь пробелов, так что общее количество символов до и включая замену несколько из восьми (это должно быть то же правило, что и в Unix). Общее количество пробелов, предшествующих первому непустому символу, определяет отступ строки. Отступ не может быть разделен на несколько физических линий с помощью обратной косой черты; пробелы до первой обратной косой черты определяет отступ.

(кроме вступительного слова "Первый", они идентичны.)

Python 3 добавляет дополнительный абзац:

отступ отклоняется как несогласованный, если исходный файл смешивает вкладки и пробелы таким образом, что значение зависит от стоимости вкладки в пробелах; в этом случае возникает TabError.

Это означает, что TAB vs 8-пример пространства, который работал в Python 2, генерировал TabError в Python 3. Лучше всего-это необходимо в Python 3-убедиться, что последовательность символов, составляющих отступ на каждой строке в блоке, идентична. PEP8 говорит: "используйте 4 пробела на уровень отступа". (Стандарты кодирования Google говорят: "используйте 2 пробела".)


соблюдать PEP 8 для стиля Python. PEP 8 говорит: Отступ

используйте 4 пробела на каждый уровень отступа.

для действительно старого кода, который вы не хотите испортить, вы можете продолжить для использования вкладок 8 пробелов.

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

никогда не смешивайте пробелы и символы табуляции.

самый популярный способ отступа Python-только с пробелами. Этот второй по популярности способ - только с вкладками. Код отступ с смесь вкладок и пробелов следует преобразовать в использование пробелов исключительно. При вызове интерпретатора командной строки Python с помощью опция-t выдает предупреждения о коде, который незаконно смешивает вкладки и пространства. При использовании-tt эти предупреждения становятся ошибками. Эти варианты настоятельно рекомендуется!


в Python 2, интерпретация TAB как будто он преобразуется в пробелы с помощью 8-пробелов табуляции (как предусмотрено предыдущими ответами уже); то есть каждый TAB продвигает отступ от 1 до 8 пробелов, так что результирующий отступ делится на 8.

однако это больше не относится к Python 3-in Python 3 смешивание пробелов и вкладок всегда является ошибкой - вкладки соответствуют только вкладкам, а пробелы - только другим пробелы в отступе; это строка с отступом TABпробелпробел может содержать также строки с отступом пробелпробелTAB; и может содержать отступ блока с отступом TABпробелпробелTAB, но если это отступ блока содержал TABTAB, это будет считаться ошибка отступа, даже если блок будет казалось бы, простираются дальше:

отступ отклоняется как несогласованный, если исходный файл смешивает вкладки и пробелы таким образом, что значение зависит от стоимости вкладки в пробелах; в этом случае возникает TabError.

т. е. алгоритм работает следующим образом:

  • если оба количества вкладок и количество пробелов соответствует предыдущей строке (независимо от порядка), тогда эта строка принадлежит тому же блоку с предыдущей строкой

  • если число одной из (вкладок, пробелов) больше, чем в предыдущей строке, а число другой, по крайней мере, равно числу в предыдущей строке, это отступ блока

  • кортеж (tabs, spaces) совпадает с отступом от предыдущего блока - это dedents на этот блок

  • иначе IndentationError или TabError поднимается.

вот почему смешивание вкладок и пробелы или даже использование вкладок для отступов вообще будет считаться очень плохой практикой в Python.


просто не поменять их :)
Установите IDE / редактор для ввода 4 пробелов при нажатии "tab", и вы хорошо идти.


Я бы рекомендовал вам пройти PEP 8 который является "официальным" руководством по стилю Python для кода Python. Он охватывает (среди прочего) использование вкладок/пробелов.


четыре пробела - это одна вкладка (в моей настройке), но, насколько я знаю, они не взаимозаменяемы. Вы можете использовать либо пробелы, либо вкладки, но не оба.


Я считаю, что символ вкладки просто никогда не должен появляться в исходном коде ни при каких обстоятельствах. В этом нет никакого преимущества, и это бесконечный источник крошечных ошибок. - используйте символьную строку с \т если вам нужны вкладки, оно имеет то преимущество, что это самодокументируемыми.

здеськлассическая статья о вкладках против пробелов - я использую вариант elisp jwz в своем собственном .файл emacs.

(Я признаюсь, что лично разрыв с PEP 8, используя только 2 отступы символов - 4 символа-это много, когда ваши строки составляют всего 80 символов...)