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

264

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

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

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

Шей Эрличмен
источник
Можете ли вы просмотреть эту ссылку и предоставить свои данные о том, как использовать модуль reindent.py
user1050619
Как упомянуто ниже @ andy-hayden, посмотрите на этот связанный вопрос - в основном autopep8обеспечивает отступ и многое другое: stackoverflow.com/questions/14328406/…
Pierz
2
Это безумно полезный вопрос, мне часто приходится это делать. Речь идет не о «рекомендации инструмента», а о том, «как это сделать».
Энди Хейден

Ответы:

282

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

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

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

Алекс Мартелли
источник
51
К сожалению, это не является частью обычной установки Python на Debian и Ubuntu; это разделено на python-examplesпакет.
Эфимент
16
Превосходно! Таким образом, все, что нужно пользователям Debian и Ubuntu, это apt-get этот пакет. Кроме того, сценарий также находится по адресу svn.python.org/view/python/trunk/Tools/scripts/… .
Алекс Мартелли
9
@Shay Erlichmen: попробуйте "python -tt yourscript.py"
nosklo
8
Пользователи Fedora / RedHat / CentOS должны установить пакет "python-tools".
Кристиан Чиупиту
26
Просто чтобы добавить комментарий ephemient: как только он python-examplesбудет установлен, вы найдете в нем отступ /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Ларри Гастингс
59

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

                                                        *: ret * *: retab *
: [range] ret [ab] [!] [new_tabstop]
                        Заменить все последовательности пробелов, содержащие
                        <Tab> с новыми строками пробела, используя новый
                        дано значение табуляции. Если вы не укажете новый
                        размер табуляции или ноль, Vim использует текущее значение
                        из «Tabstop».
                        Текущее значение 'tabstop' всегда используется для
                        вычислить ширину существующих вкладок.
                        С!, Vim также заменяет строки только нормальными
                        пробелы с вкладками, где это уместно.
                        С включенной функцией «расширения» 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) / напр." file.py

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

ephemient
источник
2
Сработало хорошо. Это самый простой способ исправить смешивание отступов на вкладке.
Срикант
Конечно, не самый простой способ.
CONvid19
52

Я бы достиг 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).

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

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

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

Энди Хейден
источник
это потрясающе ... Я искал такой инструмент, как rubocop рубина для python
OkezieE
1
autopep8не удается, если синтаксис неверен. Вы можете подтвердить, что с помощьюpython -tt <file.py>
Nishant
47

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
CONvid19
источник
у меня есть только один строковый код с «import os» и 4 пробела перед ним, но он не имеет отступа от этого .... любая причина почему
pkm
3
@pkm 4 пробела (или любой отступ, кратный 4) является частью PEP8
rbaleksandar
13

Используя Vim, он не должен быть более сложным, чем нажимать Esc, а затем печатать ...

:%s/\t/    /g

... в файле, который вы хотите изменить. Это преобразует все вкладки в четыре пробела. Если у вас также непоследовательный интервал, тогда это будет сложнее.

Бен Хьюз
источник
11
Можете ли вы отследить оригинальный кодер (ы) и применить расширенные методы опроса? Нет ничего хуже, чем непоследовательный отступ кода.
Бен Хьюз
3
@Ben Непоследовательный абзац - наименьшая из наших проблем от этого парня :)
Шей Эрлихмен
9

Существует также PythonTidy (так как вы сказали, что вам нравится HTML Tidy).

Это может сделать намного больше, чем просто очистить вкладки, хотя. Если вам нравятся такие вещи, стоит посмотреть.

Пол Хильдебрандт
источник
5

На большинстве UNIX-подобных систем вы также можете запустить:

expand -t4 oldfilename.py > newfilename.py

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

Crowman
источник
1
Обратите внимание, что использование одного и того же файла не работает и оставляет вас с пустым файлом, но этот ответ на самом деле работает, и я использую его, когда мне нужно преобразовать свои вкладки в пробелы. Может ли кто-нибудь объяснить отрицательный голос? Я подниму это +1.
С. Кердел
Есть ли какой-нибудь возможный способ восстановить перезаписанный файл? Только что использовал вышеупомянутый метод, и ценность моего дня исчезла с лица . Спасибо
Симас
4

Если вы ленивы (как и я), вы также можете загрузить пробную версию Wingware Python IDE, в которой есть инструмент для автоматического исправления ошибок. Это работает довольно хорошо. http://www.wingware.com/

Янского
источник
4

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

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Мартин Вегтер
источник
2
Нелегальные варианты -р.
HelloWorld
2

Попробуйте Emacs. Он имеет хорошую поддержку для отступов, необходимых в Python. Пожалуйста, проверьте эту ссылку http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

Arnkrishn
источник
2
python-mode удобен для написания Python, но ничто по ссылке не описывает, как исправить отступы в существующем файле.
Эфимент
5
Mx untabify превратит вкладки в пространство в emacs
Пол Хильдебрандт
Ссылка (эффективно) не работает. Он перенаправляет на страницу с заголовком «Язык программирования C для начинающих» (!).
Питер Мортенсен
1

Попробуйте IDLE и используйте Alt+, Xчтобы найти отступ.

Anshuman
источник
0

У меня есть простое решение этой проблемы. Вы можете сначала набрать ": retab", а затем ": retab!", Тогда все будет хорошо

hanqiang
источник
1
Тип " :retab" в каком контексте. В Vim ?
Питер Мортенсен
0

В случае, если вы пытаетесь найти инструмент для создания вашего 2-space indentedскрипта Python до tab indentedверсии, просто используйте этот онлайн-инструмент:

https://www.tutorialspoint.com/online_python_formatter.htm

Мехрдад Салими
источник