Как исправить табуляцию в питоне

Use the back space key to dedent. It is easiest if one does so before entering any code. If there is already code on the line, put the edit cursor between the end of the indent and the beginning of the code before hitting backspace. Note that in IDLE, one enters and edits, and submits complete statements for execution. Hence no secondary prompts. Example:

>>> a, x, y = 1, 2, 3  # Bind some names.  This is one statement.
>>> if a:  # When you hit return, IDLE see that you entered the header
           # of a compound statement and indents the next line with a Tab.
           # Note that I have to use 8 spaces here instead of a tab.
        print(x)  # When you hit return, IDLE keeps the same indent.
                  # Use Backspace [<--] to dedent back to the margin.
else:   # Do not line up 'else' with 'if' by adding 4 spaces.
        # Since this is another header, an indent is added on the next line.
        print(y)  # No header, indent kept the same.
        # Hit Return to enter blank line

The final blank line signals that the compound statement is complete and should be executed. Until then, one can edit any part of the statement.

I am a bit stunned that 3 people would suggest the awkward and much harder workaround of selecting the line or at least the indent and using control-[. I am thinking about how to make the easy way more obvious.

I am aware that having ‘if’, ‘elif’, and ‘else’ not lined up is a nuisance. I intend to fix this.

If you’re using Vim, see :h retab.

                                                        *:ret* *:retab*
:[range]ret[ab][!] [new_tabstop]
                        Replace all sequences of white-space containing a
                        <Tab> with new strings of white-space using the new
                        tabstop value given.  If you do not specify a new
                        tabstop size or it is zero, Vim uses the current value
                        of 'tabstop'.
                        The current value of 'tabstop' is always used to
                        compute the width of existing tabs.
                        With !, Vim also replaces strings of only normal
                        spaces with tabs where appropriate.
                        With 'expandtab' on, Vim replaces all tabs with the
                        appropriate number of spaces.
                        This command sets 'tabstop' to the new value given,
                        and if performed on the whole file, which is default,
                        should not make any visible change.
                        Careful: This command modifies any <Tab> characters
                        inside of strings in a C program.  Use "t" to avoid
                        this (that's a good habit anyway).
                        ":retab!" may also change a sequence of spaces by
                        <Tab> characters, which can mess up a printf().
                        {not in Vi}
                        Not available when |+ex_extra| feature was disabled at
                        compile time.

For example, if you simply type

:ret

all your tabs will be expanded into spaces.

You may want to

:se et  " shorthand for :set expandtab

to make sure that any new lines will not use literal tabs.


If you’re not using Vim,

perl -i.bak -pe "s/t/' 'x(8-pos()%8)/eg" file.py

will replace tabs with spaces, assuming tab stops every 8 characters, in file.py (with the original going to file.py.bak, just in case). Replace the 8s with 4s if your tab stops are every 4 spaces instead.

rishatss

python

  • Python

Добрый день господа.
Как работать с табуляцией?
Например если я хочу выделенный код табулировать. Я просто нажимаю Tab и код автоматом двигается на 4 пробела вправо.
Как это реализовать в обратную сторону ? :)


  • Вопрос задан

    более трёх лет назад

  • 1575 просмотров



2

комментария

  • mak_sim

    Без указания редактора вопрос становится риторическим :)

  • rishatss

    Максим Сёмочкин: Да.. Уже сам заметил :) Ниже привели возможные действия. Порой меняю редактор для таких вещей :) А самое что иногда надоедает, это отношение редакторов к табу :) 4 — 8 пробелов :)

Пригласить эксперта


Ответы на вопрос 1

Shift + Tab может «детабулировать» выделенный блок — но это зависит от редактора, где набирается

  • rishatss

    Python IDLE 2.7 :) Спасибо за советик :) Жизнь экономить теперь буду :)

  • Ришат Султанов то есть до этого Вы не пользовались приставкой Shift для обратного действия в ОС, браузере …, попробуйте :)

  • Ришат Султанов: Рад, что помог) Mykola: Не подскажете примеры именно отменяющих shift-хоткеев? Кроме Shift+Space для обратной прокрутки ничего не припомню.


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


  • Показать ещё
    Загружается…

27 мая 2023, в 15:01

4000 руб./за проект

27 мая 2023, в 14:55

2000 руб./за проект

27 мая 2023, в 14:11

20000 руб./за проект

Минуточку внимания

Содержание:развернуть

  • Почему табуляция в Питоне так важна?
  • Что нам говорит PEP8?
  • Примеры кода
  • 👍 Правильное оформление

  • 👎 Ошибочное оформление

  • 😐 Выборочное оформление

  • Табуляция или пробелы — что использовать? 🤷‍♂️
  • Настройка IDE для работы с отступами
  • PyCharm

  • VSCode

  • Ошибки при работе с отступами

Одна из особенностей Python — для оформления блоков кода вместо привычных фигурных скобок, как в C, C ++, Java или операторных скобок begin … end как в Pascal, используются отступы (или табуляция).

Подробнее о том, какие есть правила расстановки отступов — рассмотрим далее.

Почему табуляция в Питоне так важна?

Что такое отступ? Говоря простыми словами, это просто добавление пробела перед определенным оператором.

Отступы — важная концепция языка Питон, так как без правильного их оформления в итоге программист получит ошибку типа IndentationError, код при этом не будет скомпилирован.

Многим программистам жесткое соблюдение отступов может показаться избыточной мерой. Однако именно из-за строго соблюдения правил форматирования, код на Python — чистый, понятный и аккуратный. Отсюда следующие плюсы 👍:

  • Не нужно проверять, не потерялась ли лишняя скобка;
  • Читать такой код удобнее (по «Философии Python» — читаемость имеет значение);
  • Легче работать со сторонними библиотеками;
  • Код вашего коллеги будет максимально похож на ваш код.

💁‍♂️ Чтобы понять, насколько это важно, можно представить ситуацию, когда в книге удалить все номера страниц, в результате чего нельзя будет понять, где продолжать чтение. Без использования indent-отступа интерпретатор Python не сможет определить, какой оператор необходимо выполнять следующим, что относится к разным блокам кода. В результате и возникает исключение типа IndentationError.

Отступы в языке Python — это способ указать интерпретатору, что оператор (или целая их группа) — это определенный block-комбинация команд для выполнения задачи.

В большинстве других языков, таких как семейство C, Java и прочих для оформления блоков используются фигурные скобки, в Питоне — отступы, для создания которых обычно используются пробелы. Все команды, отделенные от начала строки одним и тем же расстоянием, принадлежат к одному и тому же блоку. Если в нем выделяется еще один блок — используется еще один отступ вправо, и так далее. Рассмотрим это на примере:

def my_small_function(): # [0 пробелов] определение функции со знаком «:» в конце
if a > b: # [4 пробела] начало блока условия, располагается внутри функции
return a # [8 пробелов] часть блока if
else: # [4 пробела] продолжение блока условия, на том же уровне, что и if
return b # [8 пробелов] часть блока else
print(my_small_function()) # [0 пробелов] вызов функции вне ее блока

💡 По умолчанию в Python используется 4 пробела в качестве отступа

Однако программист может использовать и другое их количество, но не менее одного.

Что нам говорит PEP8?

Для каждого уровня отступов необходимо использовать по 4 пробела.

Строки большой длины должны вертикально выравнивать внутренние элементы, для этого используется неявная линия в скобках или с применением висячего отступа. Во втором случае следует помнить: на первой линии не должны располагаться аргументы, остальные строки располагаются так, чтобы быть продолжением неявной линии.

Примеры кода

👍 Правильное оформление

# Выравнивание выполнено по открывающей скобке
foo = name_of_function(one, two,
three, four)

# Дополнительные отступы используются для выделения блока от остальных
def name_of_function(
one, two, three,
four):
print(one)

Расположение закрывающих скобок в конструкциях с многими строками под началом первой строки:

my_list = [
one, two, three,
four, five, six,
]

result = some_arguments(
'1', '2', '3',
'4', '5', '6',
)

👎 Ошибочное оформление

# Без вертикального выравнивания аргументы не должны располагаться на первой линии
foo = name_of_function(one, two,
three, four)

# Используется больше отступов для выделения блока от остальных
def name_of_function(
one, two, three,
four):
print(one)

😐 Выборочное оформление

# Использование небольших отступов
foo = name_of_function(
one, two,
three, four)

В многострочных конструкциях закрывающие скобки можно устанавливать на отдельной строке под первым символом (не пробелом) последнего пункта:

some_list = [
one, two, three,
four, five, six,
]
res = some_arguments(
'1', '2', '3',
'4', '5', '6',
)

Табуляция или пробелы — что использовать? 🤷‍♂️

Согласно официальной документации, самым предпочтительным способом оформления отступов является использование пробелов, обычно 4

Табуляция может использоваться в случае поддержки готового кода, где все отступы оформлены именно таким способом.

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

Настройка IDE для работы с отступами

Чтобы при написании кода не задумываться о правильной расстановке пробелов для отступов, в редакторах кода и IDE используется специальный функционал, самостоятельно распознающий место создания отдельных блоков, в результате чего пробелы расставляются автоматически.

Рассмотрим, как можно настроить или изменить такие параметры в самых популярных IDE, когда возникает такая необходимость.

PyCharm

В случае использования интегрированной среды разработки PyCharm для настройки оформления отступов необходимо последовательно перейти по таким пунктам меню:

File → Settings → Editor → Code style → Python

Для настроек параметров есть 3 поля:

  1. Tab size — количество пробелов при нажатии клавиши Tab;
  2. Indent — количество пробелов для одного отступа;
  3. Continuation indent — количество пробелов для отступа, когда следующая строка продолжает предыдущую.

💭 Еще одна полезная опция — отображение точек вместо каждого пробела, что особо удобно при поддержке чужого кода. В PyCharm для активации этой функции следует перейти File → Settings → Editor → General → Appearance → Show whitespaces, установив галочку напротив соответствующего пункта.

VSCode

Для настройки аналогичных функций в VSCode нужно нажать комбинацию клавиш ctrl + , или перейти по пунктам меню

File → Preferences → Settings

Далее для ускорения в строке поиска ввести tab и установить нужные значения для таких опций:

  • editor: insert spaces — использовать ли пробелы вместо табуляции;
  • editor: tab size — желаемое количество пробелов для одного отступа.

Ошибки при работе с отступами

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

expected an indented block

Данная ошибка может возникать в случае, когда после оглашения начала блока кода — def, if, while и некоторых других на следующей строке отсутствует отступ. Для ее исправления после начала блока должна быть хотя бы одна вложенная строка с отступом.

unexpected indent

Возникает ошибка в том случае, когда перед началом строки есть отступ, но на предыдущей отсутствует оглашение начала блока кода, то есть, нет def, if, elif, else, for или while. Обычно такая ситуация возникает случайно, когда программист ставит слишком много пробелов в начале строки.

Indentationerror: expected an indented block

Ошибка возникает в том случае, когда после оглашения блока кода на следующей строке нет отступа или же сделанные отступы состоят из разного количества пробелов.


Таким образом, отступы в языке программирования Python, в отличие от многих других, играют такую же важную роль, как и служебные слова, так как именно они определяют создание блоков кода. Для каждого indent рекомендуется использовать 4 пробела, однако программист по своему желанию может установить и другое их количество, главное — одинаковое во всем проекте.

Производит замену табуляции пробелами.

Синтаксис:

str.expandtabs(tabsize=8)

Параметры:

  • tabsize=8int, количество пробелов для заменены табуляции, по умолчанию 8.

Возвращаемое значение:

  • измененная копия строки

Описание:

Метод str.expandtabs() возвращает копию строки str, в которой все символы табуляции t заменяются одним или несколькими пробелами, в зависимости от текущего столбца и заданного размера табуляции tabsize.

Для замены табуляций изначально номер столбца задаётся равным нулю и начинается посимвольный обход строки.

При обходе строки str, если попадается символ табуляции t, то на его место вставляется столько пробелов, что бы текущий номер столбца стал равным позиции следующей табуляции. При этом сам символ табуляции не копируется.

Если встречается символ переноса строки n или возврата каретки r, то он сохраняется в строке, а текущий номер столбца сбрасывается на 0. Любой другой символ копируется без изменений, а текущий столбец увеличивается на единицу.

Примеры замены табуляции пробелами.

>>> '01t012t0123t01234'.expandtabs()
'01      012     0123    01234'
>>> '01t012t0123t01234'.expandtabs(4)
'01  012 0123    01234'


# Есть список строк
x = ['Метод возвращает копию строки',  
     'которой все символы табуляции', 
     'заменяются одним или несколькими', 
     'пробелами зависимости текущего столбца']

# Нужно слова в строках с расставить по 
# столбцам, например, для лучшей наглядности
for item in x:
    item = item.replace(' ', 't')
    s = item.expandtabs(13)
    print(s)


# Метод       возвращает  копию       строки
# которой     все         символы     табуляции
# заменяются  одним       или         несколькими
# пробелами   зависимости текущего    столбца

Понравилась статья? Поделить с друзьями:
  • Как составить смесь для штукатурки
  • Как найти трек который забыл
  • Как найти тайского кота
  • Как найти дерево метаданных
  • Как найти вещество по атомной массе