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

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

32
задан Lukas 9 January 2010 в 18:57
поделиться

6 ответов

Может быть, веб-камера на другом компьютере сломана/неисправна? Или имеет одну из веб-камер, которая не поддерживает API DirectShow, на котором, я думаю, AForge опирается.

-121--3266150-

CRTP: Любопытно повторяющийся шаблон Образца

CRTP происходит при передаче класса в качестве параметра шаблона его базовому классу:

template<class Derived>
struct BaseCRTP {};

struct Example : BaseCRTP<Example> {};

В пределах базового класса, он может получить до производного экземпляра, в комплекте с производным типом , просто путем литья (либо static _ cast , либо dynamic _ cast work):

template<class Derived>
struct BaseCRTP {
  void call_foo() {
    Derived& self = *static_cast<Derived*>(this);
    self.foo();
  }
};

struct Example : BaseCRTP<Example> {
  void foo() { cout << "foo()\n"; }
};

Фактически вызов _ foo был введен в производный класс с полным доступом к членам производного класса.

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

-121--972791-

Места не считаются эквивалентными табуляции. Строка с отступом табуляции отличается от строки с отступом 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 местам. Как Алекс Мартелли точек в комментарии , в Python 2 вкладки эквивалентны 8 местам, и адаптация примера с помощью вкладки и 8 мест показывает, что это действительно так.

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

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


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

Python 2 говорит:

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

Python 3 говорит:

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

(Кроме начального слова «First», они идентичны.)

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

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

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

35
ответ дан 27 November 2019 в 20:18
поделиться

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

Вот классическая статья о tabs vs пробелы - я использую вариант jwz's elisp в моем собственном файле .emacs.

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

.
0
ответ дан 27 November 2019 в 20:18
поделиться

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

2
ответ дан 27 November 2019 в 20:18
поделиться

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

5
ответ дан 27 November 2019 в 20:18
поделиться

Здесь есть несколько проницательных ответов, но что-то, что интересует меня движущим требованием для запуска нескольких JVM. Почему ты думаешь, что тебе нужно это сделать? При необходимости параллельной обработки может потребоваться многопотоковое приложение, а не несколько JVM. Поскольку каждый JVM может потребовать значительных ресурсов и вы хотите иметь связь между путями выполнения, это может быть лучшим решением для ваших потребностей.

-121--3044109-

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

-121--2070632-

Для стиля Python выполните команду PEP 8 . В PEP 8 говорится: Отступы

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

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

Вкладки или места?

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

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

18
ответ дан 27 November 2019 в 20:18
поделиться

Просто не меняйте их :)
Настройте IDE/редактор на ввод 4-х пробелов при нажатии на "tab", и все готово к работе.

5
ответ дан 27 November 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: