Вопрос-Ответ

How to fix Python indentation

Как исправить отступ Python

У меня есть некоторый код на Python с непоследовательным отступом. В нем много сочетаний табуляции и пробелов, что усугубляет проблему, и даже отступы на пробелах не сохраняются.

Код работает так, как ожидалось, но его сложно поддерживать.

Как я могу исправить отступ (например, HTML Tidy, но для Python), не нарушая код?


Некоторые рекомендации для конкретного редактора:

Переведено автоматически
Ответ 1

Используйте reindent.py скрипт, который вы найдете в Tools/scripts/ каталоге вашей установки Python:


Измените файлы Python (.py) на использование отступов в 4 пробела и отсутствие жестких символов табуляции. Также обрежьте лишние пробелы и табуляции с концов строк и удалите пустые строки в конце файлов. Также убедитесь, что последняя строка заканчивается символом перевода строки.


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


ПРИМЕЧАНИЕ: Если в вашем дистрибутиве Linux по умолчанию не установлен reindent с Python:

Во многих дистрибутивах Linux не reindent установлено по умолчанию с помощью python --> один простой способ получить reindent это сделать pip install reindent.

p.s. Альтернативой pip является использование вашего менеджера пакетов дистрибутивов (т.Е. apt-get, yum, dnf), но тогда вам нужно выяснить, в каком пакете есть инструмент командной строки, потому что каждый дистрибутив имеет инструмент в другом пакете.

Ответ 2

Я бы обратился к autopep8, чтобы сделать это:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Примечание: E101 и E121 имеют отступ pep8 (я думаю, вы можете просто передать--select=E1, чтобы исправить все проблемы, связанные с отступом, - те, которые начинаются с E1).

Вы можете применить это ко всему вашему проекту, используя recursive flag:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

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

Ответ 3

Если вы используете Vim, смотрите :h retab.

 *:ret * *: retab*
:[диапазон] ret[ab][!] [new_tabstop]
Замените все последовательности пробелов, содержащие
<Tab> с новыми строками пробелов, используя новое значение tabstop.
указано значение tabstop. Если вы не укажете новый размер
tabstop или он равен нулю, Vim использует текущее значение
'tabstop'.
Текущее значение 'остановка табуляции-это всегда
расчет ширины существующих вкладок.
С !, ВИМ также заменяет строки только нормальные
места с закладками, где это уместно.
При включении 'expandtab' Vim заменяет все табуляции на
соответствующее количество пробелов.
Эта команда устанавливает 'tabstop' в новое заданное значение,
и если она выполняется для всего файла, что используется по умолчанию,
не должно вносить никаких видимых изменений.
Осторожно: эта команда изменяет любые символы <Tab>
внутри строк в программе на C. Используйте "\t", чтобы избежать
этого (в любом случае, это хорошая привычка).
":retab!" также может изменять последовательность пробелов на
символы <Tab>, что может испортить printf().
{не в Vi}
Недоступно, если функция |+ex_extra| была отключена во время компиляции
.

Например, если вы просто наберете

:ret

все ваши вкладки будут расширены до пробелов.

Возможно, вы захотите

:se et " сокращение для :set expandtab

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


Если вы не используете Vim,

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

заменит табуляцию пробелами, предполагая, что табуляция останавливается через каждые 8 символов, в file.py (с оригиналом, идущим на file.py.bak, на всякий случай). Замените 8 на 4, если ваши табуляции расположены через каждые 4 пробела.

Ответ 4

autopep8 -i script.py

Используйте autopep8

autopep8 автоматически форматирует код Python в соответствии с PEP 8
nullstyle
руководством. Он использует pep8 утилиту для определения, какие части nullcode необходимо отформатировать. autopep8 способен исправить большинство nullformatting проблем, о которых может сообщить pep8.

pip install autopep8
autopep8 script.py # print only
autopep8 -i script.py # write file
python