Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

"^I" показывает a 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 пробелам).


Упс - неловко; мое доказательство в контрпример показывает, что вкладки не эквивалентны 4 пробелам. Поскольку Alex Martelli указывает на comment, в Python 2 вкладки эквивалентны 8 пробелам, и адаптация примера с вкладкой и 8 пробелами показывает, что это действительно так.

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

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


В Python 3 правила немного отличаются (отмечены Antti Haapala). Для сравнения:

Python 2 говорит:

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

Python 3 говорит:

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

(Помимо вводного слова "Во-первых", они идентичны.)

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

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

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

Ответ 2

Следуйте PEP 8 для стиля Python. PEP 8 говорит: Отступы

Используйте 4 пробела на уровне отступа.

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

  • в противном случае выражается IndentationError или TabError.

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

Ответ 4

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

Ответ 5

Я бы порекомендовал вам пройти http://www.python.org/dev/peps/pep-0008/, который является "официальным" руководством по стилю python для кода Python. Он охватывает (помимо прочего) использование вкладок/пробелов.

Ответ 6

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

Ответ 7

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

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

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