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

Ответ 11

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

Ответ 12

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