Как исправить отступы 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 пробела.


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

у меня есть только один строковый код с «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. Вы можете легко написать сценарий оболочки, чтобы сделать это с кучей файлов одновременно, сохраняя оригинальные имена файлов.


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


2
python-mode удобен для написания Python, но ничто по ссылке не описывает, как исправить отступы в существующем файле.
Эфимент

5
Mx untabify превратит вкладки в пространство в emacs
Пол Хильдебрандт

Ссылка (эффективно) не работает. Он перенаправляет на страницу с заголовком «Язык программирования C для начинающих» (!).
Питер Мортенсен


0

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.