Как исправить отступ Python
У меня есть некоторый код Python, который имеет несовместимые отступы. Существует множество сочетаний вкладок и пробелов, которые еще больше усугубляют ситуацию, и даже отступы в пространстве не сохраняются.
Код работает, как и ожидалось, но его сложно поддерживать.
Как я могу исправить отступы (как HTML Tidy, но для Python), не нарушая код?
Ответы
Ответ 1
Используйте reindent.py
script, который вы найдете в каталоге Tools/scripts/
вашей установки Python:
Измените файлы Python (.py) для использования 4-пространственные отступы и без жесткой вкладки персонажи. Также обрезайте лишние пространства и вкладки с концов строк и удалите пустые строки в конце файлы. Также убедитесь, что последняя строка заканчивается с новой строкой.
Посмотрите на script для подробных инструкций по использованию.
Ответ 2
Если вы используете 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 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
, на всякий случай). Замените 8s на 4s, если ваши вкладки останавливаются на каждые 4 пробела.
Ответ 3
Я бы сделал для 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.
Ответ 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
Ответ 5
Используя Vim, он не должен быть более активным, чем нажатие Esc, а затем набирать...
:%s/\t/ /g
... в файле, который вы хотите изменить. Это преобразует все вкладки в четыре пробела. Если у вас есть несогласованный интервал, то это будет сложнее.
Ответ 6
Существует также PythonTidy (поскольку вы сказали, что вам нравится HTML Tidy).
Это может сделать намного больше, чем просто очистить вкладки. Если вам нравится этот тип вещей, стоит посмотреть.
Ответ 7
В большинстве UNIX-подобных систем вы также можете запустить:
expand -t4 oldfilename.py > newfilename.py
из командной строки, изменив номер, если вы хотите заменить вкладки на количество пробелов, отличных от 4. Вы можете легко написать оболочку script, чтобы сделать это с помощью нескольких файлов одновременно, сохранив исходный файл имена.
Ответ 8
Если вы ленивы (как и я), вы также можете загрузить пробную версию Wingware Python IDE, в которой есть инструмент для автоматического исправления ошибок. Это работает довольно хорошо.http://www.wingware.com/
Ответ 9
Сценарий reindent не работал для меня из-за недостающего модуля. Во всяком случае, я нашел эту команду sed
которая делает работу идеально для меня:
sed -r 's/^([ ]*)([^ ])/\1\1\2/' file.py
Ответ 10
Попробуйте Emacs. Он имеет хорошую поддержку отступов, необходимых в Python. Проверьте эту ссылку http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm
Ответ 11
У меня есть простое решение этой проблемы. Вы можете сначала набрать ": retab", а затем ": retab!", Тогда все будет хорошо
Ответ 12
Попробуйте IDLE и используйте Alt + X, чтобы найти отступы.