Інструмент для перетворення коду Python на сумісність з PEP8


113

Я знаю, що є інструменти, які підтверджують, чи відповідає ваш код Python PEP8, наприклад, є і онлайн-сервіс, і модуль python .

Однак я не можу знайти службу чи модуль, який може перетворити мій файл Python в автономний, PEP8-дійсний файл Python. Хтось знає, чи є такі?
Я припускаю, що це можливо, оскільки PEP8 стосується появи коду, правда?


1
Я не думаю, що існує якийсь інструмент, який перетворює код на сумісний з PEP8 код. PEP8 також включав правила іменування змінних, тому, якщо такий інструмент існує, він також буде перейменовувати ваші імена змінних, і ви, можливо, не зможете зрозуміти власний код.
Ашвіні Шадхарі

1
@AshwiniChaudhary Це хороший момент, також варто згадати, що зміна імен змінних може вплинути на інших, які вже використовують ваш код, тому що це не завжди є гарною ідеєю. (autopep8 цього не робить.)
Енді Хайден

Відповіді:


38

На жаль, "штурм" pep8 "(весь проект) має кілька негативних побічних ефектів:

  • багато конфліктів злиття
  • зламати гіт вину
  • ускладнити перегляд коду

В якості альтернативи (і завдяки @yp за ідею ) я написав невеликий пакет, в якому autopep8 містить лише ті рядки, над якими ви працювали з останнього комітету / гілки:

В основному залишити проект трохи краще, ніж ви його знайшли :

pip install pep8radius

Припустимо, ви закінчили свою роботу masterі готові здійснити:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

Або очистити нові рядки, які ви зробили з останнього зобов’язання:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

В основному pep8radiusзастосовується autopep8 до рядків у висновку git / hg diff (від останнього спільного комітету ).

Цей сценарій зараз працює з git та hg, якщо ви використовуєте щось інше і хочете, щоб це працювало, будь ласка, опублікуйте коментар / проблему / PR !


2
+1 дуже хороша ініціатива ... я замислююся над тим, як зробити плагін Notepad ++ з тією ж метою ... як це мій улюблений редактор для Windows
kmonsoor

1
@kmonsoor хороша ідея, я не думав про плагіни редактора! Дозвольте мені знати на Github будь-яким способом, що я можу допомогти / полегшити використання поза CLI ... Я бачу кілька (вирішуваних) питань.
Енді Хейден

тут я знайшов цікавий список редакторів плагінів github.com/jcrocholl/pep8/wiki/RelatedTools , хоча для Notepad ++ не пощастило
kmonsoor

1
Я щойно створив сценарій для переходу між Notepad ++ та Autopep8, спираючись на інший плагін "Python Script". Однак це працює. Перевірте тут: bit.ly/pep8_tonizer
kmonsoor

185

Ви можете використовувати autopep8 ! Поки ви робите собі чашку кави, цей інструмент із задоволенням усуває всі ті прискіпливі порушення PEP8, які не змінюють значення коду.

Встановіть його через pip:

pip install autopep8

Застосуйте це до певного файлу:

autopep8 py_file --in-place

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

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

Примітка: Іноді за замовчуванням 100 пропусків недостатньо, я встановив його на 2000, оскільки він досить високий, і він буде захоплювати всі файли, крім найскладніших (він перестає проходити, як тільки не знайде вирішуваного порушення pep8) ...

На даний момент я пропоную повторно протестувати і виконувати завдання!

Якщо ви хочете "повного" дотримання PEP8: одна з тактик, яку я використовував, - це запустити autopep8, як зазначено вище, а потім запустіть PEP8, який друкує інші порушення (файл, номер рядка та що):

pep8 project_dir --ignore=E501

і вручну змінювати їх окремо (наприклад, E712s - порівняння з булевими).

Примітка: autopep8 пропонує --aggressiveаргумент (щоб нещадно "виправити" ці порушення, що змінюють значення), але будьте обережні, якщо ви використовуєте агресивні, можливо, доведеться налагоджувати ... (наприклад, у numpy / pandas, True == np.bool_(True)але ні True is np.bool_(True)!)

Ви можете перевірити, скільки порушень кожного типу (до і після):

pep8 --quiet --statistics .

Примітка. Я вважаю, що E501 (рядок занадто довгий) є окремим випадком, оскільки їх, мабуть, буде багато у вашому коді, а іноді вони не виправляються автопепі8.

Як приклад, я застосував цю методику до бази кодів панди .


@hayden Чи є у вас коментарі щодо того, наскільки це надійно, і співвідношення автоматичних виправлень до дивних питань, яке воно вводить?
Маріус

@Marius Я використав це для коду панди (який досить великий), і він не показав жодних дивних проблем, він не змінить код, який змінює значення , я оновив свою відповідь, щоб згадати про них. Раніше у нього виникла проблема з хешбангом Sphinx (тепер виправлена ​​помилка в PEP8).
Енді Хайден

2
Чи це примушує Струнку та Білого в коментарях?
Ерік

1
Станом на 25 жовтня 2017 року pep8пакет, зазначений у цій відповіді, перейменований на pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007

8

@Andy Hayden дав хороший огляд autopep8. На додаток до цього є ще один пакет під назвою pep8ify, який також робить те ж саме.

Однак обидва пакети можуть видаляти лише помилки ворсу, але вони не можуть форматувати код.

little = more[3:   5]

Наведений вище код залишається таким же після pep8ifying також. Але код ще не виглядає добре. Ви можете використовувати формати форматів, таких як yapf , який буде форматувати код, навіть якщо код сумісний з PEP8. Вищий код буде відформатований в

little = more[3:5]

Деколи це навіть руйнує ваше ручне форматування. Наприклад

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

буде перетворено на

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

Але ви можете сказати це ігнорувати деякі частини.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

Взято з моєї старої публікації в блозі: Автоматично PEP8 та відформатуйте свій код Python!


2
Чи little = more[3: 5]помилка в pep8 (бібліотека)? yapf, безумовно, майбутнє тут, алгоритм за ним (по суті, найкоротший шлях у графіку всіх варіантів форматування) - дуже елегантне рішення, і, швидше за все, буде менше помилок, а також канонічного форматування.
Енді Хайден

@AndyHayden Схоже, це відсутність функції, вона не виправляє E225
ChillarAnand

5

Якщо ви використовуєте eclipse + PyDev, ви можете просто активувати autopep8 з налаштувань PyDev: Windows -> Налаштування -> введіть 'autopep8' у фільтр пошуку.

Поставте прапорець "використовувати autopep8.py для форматування коду?" -> Гаразд

Тепер у форматі CTRL-SHIFT-F eclipse слід відформатувати ваш код за допомогою autopep8 :)

знімок екрана


3

Я провів широкі дослідження щодо різних інструментів для стилю пітона та коду. Існує два типи інструментів: лінери - аналізуючи свій код та дайте попередження про погано використовувані стилі коду та показуючи поради, як його виправити, та форматори коду - коли ви зберігаєте файл, він переформатує ваш документ за допомогою стилю PEP.

Оскільки переформатування повинно бути більш точним - якщо воно переформатує те, що ви не хочете, воно стане марним - вони охоплюють меншу частину PEP, лінери показують набагато більше.

Усі вони мають різні дозволи на конфігурування - наприклад, pylinter, що може бути налаштований у всіх його правилах (ви можете вмикати / вимикати кожен тип попереджень), чорний зовсім не налаштований.

Ось кілька корисних посилань та навчальних посібників:

Документація:

Підводки (в порядку популярності):

Форматори коду (у порядку популярності):


1

Тут багато.

Зазвичай IDE мають вбудовану можливість форматування. IntelliJ Idea / PyCharm робить, те ж саме стосується і плагіна Python для Eclipse тощо.

Існують формати / лінтери, які можуть націлювати кілька мов. https://coala.io - хороший приклад цього.

Потім є інструменти єдиної мети, про які багато хто згадується в інших відповідях.

Одним із специфічних методів автоматичного переформатування є аналіз файлу в дереві AST (без відкидання коментарів), а потім повернення його назад до тексту (тобто нічого не зберігається в оригінальному форматуванні). Прикладом цього може бути https://github.com/python/black .

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