Я решил, что я узнаю немного Python. В первом введении говорится, что он использует отступы для групповых операторов. В то время как лучшая привычка явно использует только одно из них, что произойдет, если я их заменим? Сколько пробелов будет считаться равным одной вкладке? Или он не сможет работать вообще, если смешаны табуляции и пробелы?Python-интерпретация вкладок и пробелов в отступ
ответ
Пробелы не рассматриваются как эквивалентные языку. Строка с отступом с вкладкой находится в другом отступе от линии с отступом с 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 пробела».)
4 пробела - одна вкладка (в моей настройке) , но насколько я знаю, они не меняются местами. вы можете использовать пробелы или вкладки. не оба.
Не обязательно. Это зависит от вашей настройки. –
Просто не меняйте их :)
Установите свой IDE/редактор, чтобы ввести 4 пробела после нажатия «вкладки», и вам хорошо идти.
Я бы порекомендовал вам пройти http://www.python.org/dev/peps/pep-0008/, который является «официальным» руководством по стилю python для кода Python. Он охватывает (помимо прочего) использование вкладок/пробелов.
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!
Текущая ссылка PEP8 такова: http://legacy.python.org/dev/peps/pep-0008/ PLZ рассмотреть вопрос об обновлении ответа. благодаря – kmonsoor
Я считаю, что символ табуляции ни в коем случае не должен появляться в исходном коде. Нет никакого преимущества, и это бесконечный источник крошечных ошибок. - используйте символьную строку с \ t, если вам нужна вкладка, у нее есть то преимущество, что она самодокументирована.
Here классическая статья о вкладках и пробелах - я использую вариант elisp jwz в моем собственном файле .emacs.
(каюсь лично порывая с PEP 8 с помощью отступа всего 2 символов - 4-х символов много, когда ваши строки только 80 символов ...)
В 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.
- 1. Непоследовательное использование вкладок и пробелов
- 2. Java: подсчет пробелов и вкладок
- 3. подсчет строк, пробелов и вкладок
- 4. YAML Сколько пробелов на отступ?
- 5. Отступ Python (Ошибка вкладок/интервалов)
- 6. Подсчет пробелов, вкладок и новой строки
- 7. Сохранение вкладок предпочтений затмений и пробелов
- 8. Подсчет новых строк, вкладок и пробелов
- 9. Что такое непоследовательное использование вкладок и пробелов?
- 10. RegExp для пробелов без вкладок
- 11. tinyxml2 - отступ с вкладкой вместо пробелов
- 12. eclipse: изменение # пробелов на отступ/unindent
- 13. Vim: Отступ с одним пространством (без пробелов)
- 14. адаптивный отступ в emacs?
- 15. Удаление вкладок при использовании вкладок в виде пробелов
- 16. Получить Java для использования вкладок вместо пробелов для отступов
- 17. Сохранение пробелов/вкладок в выводах с file.write()
- 18. как отступ блока кода python без использования вкладок
- 19. «непостоянное использование вкладок и пробелов в отступе» от easy_install
- 20. Непосредственное использование вкладок и пробелов при добавлении try и except
- 21. Отступ и интеллектуальный отступ в wxStyledTextCtrl (Scintilla)
- 22. Установить отступ python до 2 пробелов в emacs 23?
- 23. Вставка пробелов вместо вкладок во ВСЕХ файлах
- 24. PhpStorm удаление вкладок/пробелов при каждом сохранении
- 25. Notepad ++ Автоматическое обнаружение вкладок или пробелов Python
- 26. Параметры PowerShell Param ValidateSet с заполнением пробелов и вкладок
- 27. Проверка строк для любых символов, кроме пробелов и вкладок
- 28. Использование вкладок только для отступов в Emacs
- 29. Многострочный отступ Eclipse использует вкладки вместо пробелов (pydev)
- 30. Обработка пробелов в виде вкладок в VS Code
К сожалению, вкладки ARE считаются эквивалентными пробелам - в частности, восемь пробелов, так как документы говорят довольно четко. Никогда не смешивать вкладки и пробелы лучше всего, но вам нужно запустить Python с помощью '-t' (или' -tt'), чтобы получить предупреждения (или ошибки) за нарушения указанной передовой практики. –
[Справочник по языку Python] (http://docs.python.org/2/reference/lexical_analysis.html#indentation) говорит: 'Во-первых, вкладки заменяются (слева направо) на один-восемь пробелов, таких как что общее количество символов до и включая замену кратно восьми (это должно быть тем же самым правилом, которое используется Unix). Общее количество пробелов, предшествующих первому непустому символу, затем определяет отступ строки. – gkcn
. Предыдущий и этот ответ применим только к ** Python 2 **. –