Недавно пришлось столкнуться с существующим кодом, который смешивал пробелы и табуляции, это действительно сбивает с толку.
Когда вы микшируете (что вам действительно не следует делать, но, к сожалению, оно существует), кажется, что «1 tab == 1 indent level» не соответствует действительности.
Возьмите следующий пример (пробовал с Python 2.7):
# Mostly use spaces
class TestClass:
def __init__(self):
self.total = 0
def add(self, x):
# 8 spaces at the start of the following line:
self.total += x
# SO automatically uses spaces, but use tabs in the next 2 lines.
# One tab at the start of the following line:
if self.total > 10:
# Two tabs at the start of the following line:
print "Greater than 10!"
# Now use spaces again.
return self.total
tc = TestClass()
print "Total: %d" % (tc.add(5),)
print "Total: %d" % (tc.add(5),)
print "Total: %d" % (tc.add(5),)
Здесь есть 4 пробела перед def add(...)
(1 уровень отступа), 8 пробелов перед self.total += x
(2 уровня отступа) и одна вкладка перед if self.total > 10
.
Тем не менее, эта одиночная вкладка ведет себя как 2 уровня отступа, поскольку этот код работает. Напротив, если вы замените все вкладки на 4 пробела (один уровень отступа, в котором находится def
внутри класса), вы получите неожиданную ошибку отступа до return
, потому что она больше не в def
блок.
Это действительно , путать с редакторами, которые показывают вкладки в виде 4 символов. Конечно, это можно настроить, но это также повлияет на средства просмотра исходного кода (например, такие как GitHub), где не всегда легко настроить (или сразу увидеть, что вам нужно это сделать, когда вы можете).
Вкладка против. Поведение пространства всегда будет зависеть от редактора:
- Если ваш редактор автоматически вставляет пробелы при каждом нажатии клавиши табуляции, он вставляет правильное количество пробелов, так что другой редактор будет отображать точно такой же стиль.
- Если ваш редактор не использует вкладки, всегда есть вероятность, что вы не заметите строку, которая использует пробелы вместо вкладок (особенно если в проекте используются другие редакторы).
У обоих есть свои недостатки. Суть в том, что должен быть произвольный выбор между табуляцией и пробелами, но они никогда не должны смешиваться. Поскольку вы никогда не знаете, как ваш код будет читаться и использоваться позже, хорошо иметь соглашение, которое затрагивает все кодировщики Python. PEP-8 говорит пробелы, пусть будет так.
Важно не делать это способом Java :
В качестве единицы отступа должны использоваться четыре пробела. Точный
конструкция отступа (пробелы и табуляции) не указана. Вкладки
должен быть установлен точно каждые 8 пробелов (не 4).
Да ... 1 вкладка = 2 уровня отступа в мире Java! К счастью, это не имеет такого же значения с точки зрения компиляции.