Инструмент для преобразования кода Python в соответствие с PEP8

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

Однако я не могу найти службу или модуль, которые могут преобразовать мой файл Python в автономный, PEP8-действительный файл Python. Кто-нибудь знает, если они есть? Я предполагаю, что это возможно, поскольку PEP8 - это все о появлении кода, верно?

Ответ 1

К сожалению, "pep8 storming" (весь проект) имеет несколько негативных побочных эффектов:

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

В качестве альтернативы (и спасибо @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

Вы можете использовать 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 .

Примечание. Я считаю, что E501s (слишком длинная строка) - это особый случай, поскольку в вашем коде, вероятно, будет много их, и иногда они не исправляются с помощью autopep8.

В качестве примера я применил этот метод к базе данных pandas.

Ответ 3

@Энди Хейден дал хороший обзор autopep8. В дополнение к этому есть еще один пакет под названием pep8ify, который также делает то же самое.

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

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!

Ответ 4

Если вы используете eclipse + PyDev, вы можете просто активировать autopep8 из настроек PyDev: Windows → Настройки → введите "autopep8" в фильтр поиска.

Проверьте "использовать autopep8.py для форматирования кода?" → OK

Теперь форматирование кода eclipse CTRL-SHIFT-F должно форматировать ваш код, используя autopep8:)

screen shot

Ответ 5

Здесь очень много.

В интегрированные среды разработки обычно встроены некоторые возможности форматирования. IntelliJ Idea/PyCharm делает то же самое, что и плагин Python для Eclipse, и так далее.

Существуют форматеры/линтеры, которые могут работать с несколькими языками. https://coala.io является хорошим примером этого.

Тогда есть единственные инструменты назначения, о которых многие упоминаются в других ответах.

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