Интерпретация 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 символов...)