Як мені автоматично відформатувати певний код Python для правильного форматування?


81

У мене є якийсь існуючий код, який не відформатовано послідовно - іноді для відступу використовуються два пробіли, іноді чотири тощо. Сам код правильний і добре перевірений, але форматування жахливе.

Чи є в Інтернеті місце, де я можу просто вставити фрагмент коду Python і зробити його для мене автоматичним відступом / форматуванням? Як варіант, чи є Xтакий, що я можу зробити щось подібне X --input=*.pyі перезаписати кожен файл відформатованою версією?



1
У vim: плагін python-mode пропонує команду :PyLintAutoза допомогою autopep8
Hotschke

Відповіді:


54

Редагувати: сьогодні я б рекомендував autopep8 , оскільки він не тільки виправляє проблеми з відступами, але й (на ваш розсуд) робить код відповідним багатьом іншим вимогам PEP8.


Використовуйте reindent.py. Він повинен поставлятися зі стандартним дистрибутивом Python, хоча на Ubuntu вам потрібно встановити python2.6-examplesпакет.

Ви також можете знайти його в Інтернеті .

Цей скрипт намагається перетворити будь-який сценарій python на відповідність стандарту 4-пробілу.


3
Ідеально Дякую! Я використовував find . -type f -name "*.py" | xargs python reindent.py --nobackup.
Джон Фемінелла

1
Під Fedora вам потрібно встановити python-toolsпакет, щоб отриматиreindent.py
JohnTESlade

де він знаходиться в Маверікс?
avi

@avi: Зазвичай ви можете шукати відповідь тут , але оскільки Маверікс занадто старий, я думаю, він міг би бути python2.7-examples.
unutbu

1
вам слід рекомендувати blackці дні
Борис

85

автопеп8

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

pip install autopep8
autopep8 your_script.py    # dry-run, only print
autopep8 -i your_script.py # replace content

Оновлення:

У багатьох редакторах є плагіни pep8, які автоматично переформатують ваш код відразу після збереження файлу. py-autopep8 в emacs

япф

yapf - це новий та кращий програмоутворювач коду python. який намагається отримати найкраще форматування, а не просто відповідати вимогам. Використання майже так само, як autopep8.

pip install yapf
yapf your_script.py    # dry-run, only print
yapf -i your_script.py # replace content

Для отримання додаткової інформації, як-от конфігурації форматування, прочитайте README.rstна yapf github


Оновлення 2:

Чорний

Чорний набагато кращий за япф . Це розумніше і підходить для найскладніших випадків форматування.


[Веб-сервер - ~ / скрипти] $ autopep8 -i 2c.py [Веб-сервер - ~ / скрипти] $ python 2c.py Файл "2c.py", рядок 9 із заявок. ...
pkm

Блоки коду Python визначаються за допомогою їх відступу, тому виправлення відступу - це ваша робота, а не autopep8. Інструменти не можуть і не повинні змінювати рівень відступу.
d2207197

20

Використовуйте чорний . Він навмисно має лише один варіант (довжина рядка) для забезпечення узгодженості багатьох проектів. Він застосовує PEP8.


5
Ви також можете використовувати repl.it для використання в blackІнтернеті (як вимагав OP): repl.it/repls/BriefBetterSystemcall
damio

5

Знайшов офлайн-рішення з PyCharm

У PyCharm виконайте:

1. Виберіть весь код:

[ctrl]+[A]

2. Відформатуйте весь Кодекс

[ctrl]+[alt]+[L]

Що це за кнопка [strg]?
Стевойсяк

2

Деякі редактори мають функцію автоматичного форматування, яка робить це за вас. Eclipse - один із прикладів (хоча вам, мабуть, доведеться встановити плагін python).

Ви перевіряли, який редактор ви використовуєте для такої функції?


+1 для автоматичного форматування затемнення. Просто відкрийте файл і збережіть його в затемненні. Він виправить відступ, видалить помилкові пробіли між дужками та аргументами, додасть пробіли після коми у списках та аргументах, додасть правильний інтервал навколо знаків "=" та всі інші корисні значення PEP 8.

1
Ні, не буде. Форматування Eclipse нестандартно нічого не робить зі сценаріями Python, навіть не з PyDev, встановленим як є.
luis.espinal

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