2010-01-09 8 views
26

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

ответ

32

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

Доказательство с помощью контрпримера (! ошибочным, или, в лучшем случае, ограниченное - вкладка = 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 пробелов).


К сожалению, неловко; мое доказательство в контрпример показывает, что вкладки не эквивалентны 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, правила немного отличаются (как noted по Antti Haapala). Сравните:

Python 2 говорит:

First, tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

Python 3 говорит:

Tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

(кроме открытия вр d "Во-первых," они идентичны)

Python 3 добавляет дополнительный пункт:.

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

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

+9

К сожалению, вкладки ARE считаются эквивалентными пробелам - в частности, восемь пробелов, так как документы говорят довольно четко. Никогда не смешивать вкладки и пробелы лучше всего, но вам нужно запустить Python с помощью '-t' (или' -tt'), чтобы получить предупреждения (или ошибки) за нарушения указанной передовой практики. –

+5

[Справочник по языку Python] (http://docs.python.org/2/reference/lexical_analysis.html#indentation) говорит: 'Во-первых, вкладки заменяются (слева направо) на один-восемь пробелов, таких как что общее количество символов до и включая замену кратно восьми (это должно быть тем же самым правилом, которое используется Unix). Общее количество пробелов, предшествующих первому непустому символу, затем определяет отступ строки. – gkcn

+0

. Предыдущий и этот ответ применим только к ** Python 2 **. –

2

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

+2

Не обязательно. Это зависит от вашей настройки. –

5

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

5

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

18

PEP 8 для стиля Python. PEP 8 говорит: отступов

Use 4 spaces per indentation level.

For really old code that you don't want to mess up, you can continue to use 8-space tabs.

Вкладки или Spaces?

Never mix tabs and spaces.

The most popular way of indenting Python is with spaces only. The second-most popular way is with tabs only. Code indented with a mixture of tabs and spaces should be converted to using spaces exclusively. When invoking the Python command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!

+0

Текущая ссылка PEP8 такова: http://legacy.python.org/dev/peps/pep-0008/ PLZ рассмотреть вопрос об обновлении ответа. благодаря – kmonsoor

-1

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

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

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

8

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

Однако это не относится к Python 3 больше - в Python 3 mixing of spaces and tabs are always an error - вкладки соответствуют только и табуляций только матч другие пробелы в отступе; то есть строка с отступом с TABПРОСТРАНСТВАПРОСТРАНСТВА может содержать также линии с отступом с ПРОСТРАНСТВОМПРОСТРАНСТВАTAB; и может содержать отступ блока с отступом с TABПРОСТРАНСТВАПРОСТРАНСТВАTAB, но если он отступ блок содержал TABTAB, он будет рассматриваться ошибкой отступов, даже если блок, казалось бы далее:

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

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

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

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

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

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

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

Смежные вопросы