Как исправить отступы Python - PullRequest
246 голосов
/ 21 июня 2009

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

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

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

Ответы [ 12 ]

272 голосов
/ 21 июня 2009

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

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

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

55 голосов
/ 21 июня 2009

Если вы используете Vim , см. :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.

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

:ret

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

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

:se et  " shorthand for :set expandtab

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


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

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

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

43 голосов
/ 30 октября 2014

Я бы достиг 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-совместимый .

28 голосов
/ 14 апреля 2015

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
10 голосов
/ 21 июня 2009

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

:%s/\t/    /g

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

8 голосов
/ 14 февраля 2010

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

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

5 голосов
/ 25 мая 2013

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

expand -t4 oldfilename.py > newfilename.py

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

5 голосов
/ 22 августа 2010

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

3 голосов
/ 24 октября 2015

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

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
2 голосов
/ 21 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...