Вкладки и пробелы в программировании на Python - PullRequest
323 голосов
/ 23 сентября 2008

Я всегда использовал вкладки для отступов, когда занимаюсь программированием на Python. Но затем я столкнулся с вопросом здесь, на SO, где кто-то указал, что большинство программистов на Python используют пробелы вместо вкладок, чтобы минимизировать ошибки редактора.

Как это меняет дело? Существуют ли другие причины, по которым в Python вместо пробелов можно использовать пробелы? Или это просто неправда?

Стоит ли сразу переключать мой редактор, чтобы вставлять пробелы вместо вкладок, или продолжать работать, как раньше?

Ответы [ 34 ]

0 голосов
/ 23 сентября 2008

Люди будут использовать разные редакторы для одного и того же кода. Эти редакторы будут представлять вкладку на экране по-разному. Если вы работаете с редактором, который представляет вкладку как 4 пробела, если вы отступите первую строку на "\t ", а вторую на "\t\t", они будут выглядеть так, как будто находятся на одном уровне отступа: 8 пробелов ,

Интерпретатор Python не знает вашего редактора, и он должен интерпретировать вкладку как некоторое количество отступов. Фактически, он интерпретирует вкладку как 8 пробелов, поэтому он будет видеть уровни отступа, отличные от того, что вы предполагали: 12 пробелов для первой строки, 16 пробелов для второй. Ты поджарен

0 голосов
/ 23 сентября 2008

Я использую два пробела и редактор (kwrite), который вставляет пробелы вместо табуляции, когда я нажимаю клавишу табуляции.

0 голосов
/ 26 октября 2012

Я недавно переключился с табуляции на пробелы для соответствия требованиям PEP 8.

Мне ранее нравились вкладки по двум причинам:

  1. С помощью вкладок каждый может видеть код с уровнем отступа своего выбор; просто используйте пробелы справа и вкладки слева.
  2. очень сильно хочет получить вкладки

... но после того, как я осознал важность PEP 8, я все равно переключился. На мой взгляд, главное значение пробелов над вкладками - это простота - то, что вы видите, это то, что у вас есть. И соответствие PEP 8. И я придумал правило Vim, которое включало бы пробелы для файлов Python, оставляя вкладку Makefile.

0 голосов
/ 26 октября 2012

Недавно пришлось столкнуться с существующим кодом, который смешивал пробелы и табуляции, это действительно сбивает с толку.

Когда вы микшируете (что вам действительно не следует делать, но, к сожалению, оно существует), кажется, что «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! К счастью, это не имеет такого же значения с точки зрения компиляции.

...