Як виправити відступ Python


264

У мене є код Python, який має непослідовне відступ. Існує багато сумішей вкладок і пробілів, щоб зробити справу ще гіршою, і навіть відступ місця не збереглося.

Код працює як очікувалося, але його важко підтримувати.

Як я можу виправити відступ (наприклад, HTML Tidy , але для Python), не порушуючи код?


Ви можете переглянути за цим посиланням і надати свої матеріали про те , як використовувати reindent.py module-- stackoverflow.com/questions/12132481/installing-reindent-python / ...
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-отримати цей пакет. Крім того, сценарій також знаходиться на сайті svn.python.org/view/python/trunk/Tools/scripts/… .
Алекс Мартеллі

9
@Shay Erlichmen: Спробуйте "python -tt yourscript.py"
nosklo

8
Користувачі Fedora / RedHat / CentOS повинні встановити пакет "python-tools".
Крістіан Цюпіту

26
Просто для додання коментаря ефемерида: як тільки він python-examplesбуде встановлений, ви знайдете reindent у /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Ларрі Гастінгс

59

Якщо ви використовуєте Vim , див :h retab.

                                                        *: ret * *: retab *
: [діапазон] ret [ab] [!] [new_tabstop]
                        Замініть всі послідовності пробілів, що містять a
                        <Tab> з новими рядками пробілу з використанням нового
                        Дане значення табстоп. Якщо ви не вкажете нове
                        розмір табстопа або він дорівнює нулю, Vim використовує поточне значення
                        "табустоп".
                        Поточне значення 'tabstop' завжди використовується
                        обчислити ширину існуючих вкладок.
                        З !, Vim також замінює рядки лише нормальних
                        пробіли з вкладками, де це доречно.
                        Якщо увімкнено функцію "розширення", Vim замінює всі вкладки на
                        відповідна кількість пробілів.
                        Ця команда встановлює 'tabstop' на нове значення,
                        і якщо виконується у всьому файлі, який за замовчуванням,
                        не повинно вносити видимих ​​змін.
                        Обережно: Ця команда змінює будь-які символи <Tab>
                        всередині рядків програми C. Використовуйте "\ t", щоб уникнути
                        це (це все одно є хорошою звичкою).
                        ": retab!" може також змінити послідовність пробілів на
                        <Tab> символи, які можуть зіпсувати printf ().
                        {не в Vi}
                        Недоступно, коли | + ex_extra | функція була вимкнена в
                        час складання.

Наприклад, якщо ви просто набираєте текст

: рет

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

Ви можете захотіти

: se et "скорочення для: встановити розширення

щоб переконатися, що будь-які нові рядки не використовуватимуть буквальні вкладки.


Якщо ви не використовуєте Vim,

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

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


2
Добре працювали. Це найпростіший спосіб виправити змішування відступів вкладки.
Srikant

Напевно, не найпростіший спосіб.
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 ruby ​​для 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

У мене є лише один код рядка з "імпортувати ОС" та 4 пробіли перед ним, але його не відступати від цього .... будь-яка причина, чому
pkm

3
@pkm 4 пробілу (або будь-який відступ, кратний 4) є частиною PEP8
rbaleksandar

13

Використовуючи Vim, це не повинно бути більше, ніж ударом Esc, а потім набору тексту ...

:%s/\t/    /g

... у файлі, який потрібно змінити. Це перетворить усі вкладки на чотири пробіли. Якщо у вас також є непослідовні інтервали, тоді це буде складніше.


11
чи можете ви знайти оригінальні кодери та застосувати розширені методи допиту? Немає нічого гіршого, ніж непослідовно відрезаний код.
Бен Х'юз

3
@Ben Непослідовний відступ - це найменше наших проблем у цього хлопця :)
Shay Erlichmen

9

Є також PythonTidy (оскільки ви сказали, що вам подобається HTML Tidy).

Однак це може зробити набагато більше, ніж просто очистити вкладки. Якщо вам подобається такий тип речі, то варто подивитися.


5

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

expand -t4 oldfilename.py > newfilename.py

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


1
Зауважте, що використання одного і того ж файлу не працює і залишає вам порожній файл, але ця відповідь насправді працює, і я використовую її, коли мені потрібно конвертувати свої вкладки в пробіли. Хто-небудь може пояснити сутичку? Я до цього +1.
С. Кердел

Чи можливий спосіб відновити перезаписаний файл? Щойно використаний вищевказаний метод, і вартість мого дня коду зникла facepalm . Спасибі
Сімас

4

Якщо ви ліниві (як я), ви можете також завантажити пробну версію Wingware Python IDE, яка має інструмент автоматичного виправлення для заплутаного відступу. Це працює досить добре. http://www.wingware.com/


4

Reindent скрипт не працював для мене, через якийсь модуль, що відсутній. У всякому разі, я знайшов цю sedкоманду, яка робить цю роботу ідеальною для мене:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

2
Незаконні варіанти -r.
HelloWorld

2

Спробуйте Emacs. Він має хорошу підтримку відступу, необхідного в Python. Перевірте це посилання http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm


2
python-режим приємний для написання Python, але нічого за посиланням не описує, як виправити відступи в існуючому файлі.
ефемія

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

Посилання (ефективно) порушено. Він перенаправляє на сторінку з назвою "Мова програмування на C для початківців" (!).
Пітер Мортенсен



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.