Инструменты для приведения Python кода к единому стилю

Раздел: Качество кода -> IDE и редакторы

Форматирование кода Python

Для поддержания единообразного стиля кода Python применяются различные инструменты. Основное внимание уделяется автоматическим форматировщикам, которые приводят код в соответствие с PEP8 и другими соглашениями.

Какое решение является самым популярным и эффективным для автоматического форматирования?

Black – это форматировщик кода Python, который не требует настройки и известен как «бескомпромиссный». Он автоматически форматирует весь код, следуя собственным правилам, которые близки к PEP8. Установка выполняется через pip: pip install black. Запуск: black имя_файла.py или black . для всей директории. Black анализирует код и переписывает его, заменяя кавычки, отступы, пробелы вокруг операторов.

# До форматирования
x=1+2
y  =  "test"
if True:print('hello')

# После black
x = 1 + 2
y = "test"
if True:
    print('hello')

Pip tools python (pip tools в python)

Типичная проблема: Black может изменить строки с комментариями или разделить длинные строки, что не всегда ожидаемо. Решение: Включить проверку в pre-commit или использовать опцию --line-length для изменения длины строки (по умолчанию 88).

Black рекомендуется для проектов, где важно отсутствие споров о стиле, и хорошо сочетается с другими инструментами (например, isort).

Как применить правила PEP8 без дополнительных зависимостей?

autopep8 – это инструмент, который вносит минимальные изменения, строго следуя PEP8. Установка: pip install autopep8. Запуск: autopep8 --in-place файл.py. В отличие от Black, autopep8 не трогает стилистические решения, которые не регламентированы PEP8 (например, длину строки можно настроить). Пример:

# Исходный код
x=5; y=6
if x>y: print('больше')

# После autopep8
x = 5
y = 6
if x > y:
    print('больше')

Python build tools (python build tools (инструменты сборки))

Проблема: autopep8 может пропустить некоторые несоответствия, если они не описаны в PEP8. Решение: Комбинировать с линтером, например flake8, для выявления всех отклонений.

Используется, когда требуется минимальное вмешательство и соблюдение именно официальных правил.

Как получить более настраиваемое форматирование?

YAPF (Yet Another Python Formatter) разработан Google и позволяет гибко настраивать стиль через файл конфигурации .style.yapf. Установка: pip install yapf. Запуск: yapf -i файл.py. Пример настройки: указать column_limit=120 или indent_width=2. Пример:

# До YAPF
my_list = [1,2,3,4,5,6,7,8,9,10,11]

# После YAPF с column_limit=60
my_list = [
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
]

Python packaging tools (python packaging tools (инструменты сборки))

Проблема: YAPF может быть медленнее на больших файлах. Решение: Использовать YAPF для отдельных модулей или в pre-commit с кешированием.

YAPF подходит для проектов, где нужны нестандартные отступы или длина строки.

Как автоматически сортировать импорты по PEP8?

isort – утилита для сортировки импортов в алфавитном порядке и по категориям. Установка: pip install isort. Запуск: isort файл.py. По умолчанию isort разделяет импорты на стандартные, сторонние и локальные. Пример:

# До isort
import os,sys

import pandas as pd
import numpy as np

from . import local_module

# После isort
import os
import sys

import numpy as np
import pandas as pd

from . import local_module

Python online код (онлайн редактор python)

Проблема: isort может конфликтовать с Black, который переставляет импорты в одну строку. Решение: Использовать isort до Black или с опцией --profile black, чтобы согласовать стили.

isort обязателен в проектах с большим количеством модулей для упорядочивания импортов.

Как одновременно проверить стиль и найти ошибки?

flake8 – это линтер, объединяющий PyFlakes, pycodestyle и McCabe. Он не изменяет код, а выводит сообщения о нарушениях. Установка: pip install flake8. Запуск: flake8 файл.py. Пример вывода:

file.py:1:1: F401 'os' imported but unused
file.py:3:5: E303 too many blank lines (2)

Find python script (поиск python скрипта)

Проблема: flake8 может выдавать ложные срабатывания на сложные конструкции. Решение: Создать файл конфигурации .flake8 и отключить ненужные проверки с помощью ignore = E203, W503.

flake8 используется для быстрой проверки перед коммитом в CI.

Как настроить автоформатирование в PyCharm?

PyCharm имеет встроенное форматирование на основе PEP8. Для автоматического форматирования файла используется Ctrl+Alt+L (Windows/Linux) или Cmd+Opt+L (macOS). Настройки доступны в Settings > Editor > Code Style > Python. Можно задать отступы, пробелы, длину строки. PyCharm также поддерживает интеграцию с внешними инструментами, такими как Black, через File Watchers.

Проблема: Встроенное форматирование может не совпадать с Black. Решение: Установить плагин Black и настроить его как внешний инструмент, отключив встроенное.

Подходит для разработчиков, предпочитающих работать в одной IDE.

Как настроить автоформатирование в VS Code?

В VS Code необходимо установить расширение Python от Microsoft. После этого в настройках (settings.json) указать форматировщик по умолчанию, например "python.formatting.provider": "black". Для сохранения файла с автоматическим форматированием включить "editor.formatOnSave": true. Аналогично можно использовать autopep8 или yapf.

// settings.json
{
    "python.formatting.provider": "black",
    "editor.formatOnSave": true
}

Проблема: После обновления расширения настройки могут сброситься. Решение: Закрепить версию расширения или использовать файл .vscode/settings.json в проекте.

VS Code с поддержкой множества расширений подходит для команд, использующих разные инструменты.

- File manager python (файловый менеджер на python)
- Microsoft vs python (python в visual studio)
- Microsoft code python (настройка python в visual studio code)

Расширенные примеры

Дополнительные детали использования форматировщиков и линтеров в реальных проектах.

Пример интеграции Black с isort через pyproject.toml

Для согласованной работы Black и isort используется конфигурация в файле pyproject.toml:

Пример
[tool.isort]
profile = "black"
line_length = 88

[tool.black]
line-length = 88

После настройки запуск isort . && black . приводит код к единому стилю.

Настройка pre-commit хука

Для автоматического форматирования перед коммитом создается файл .pre-commit-config.yaml:

Пример
repos:
- repo: https://github.com/psf/black
  rev: 24.4.2
  hooks:
  - id: black
- repo: https://github.com/PyCQA/isort
  rev: 5.13.2
  hooks:
  - id: isort
    args: ["--profile", "black"]
- repo: https://github.com/PyCQA/flake8
  rev: 7.0.0
  hooks:
  - id: flake8

После установки pre-commit (pip install pre-commit && pre-commit install) каждый коммит проверяет и форматирует код.

Пример использования YAPF с профилем Google

YAPF поддерживает несколько стилей, включая Google. Конфигурация:

Пример
[style]
based_on_style = google
column_limit = 100

Код до и после:

Пример
def foo(a, b, c, d, e, f):
    return a + b + c + d + e + f

# После YAPF (Google style)
def foo(a, b, c, d, e, f):
    return a + b + c + d + e + f

Примечание: В стиле Google отступы 4 пробела, длина строки 100.

Команда для проверки кода с flake8 и выводом в JSON

Пример
flake8 --format=json --output-file=lint.json my_project/

Результат сохраняется в JSON, что удобно для CI обработки.

Пример настройки форматирования в PyCharm для внешнего Black

Открыть Settings > Tools > File Watchers, добавить новый с параметрами:

Пример
Program: $PyInterpreterDirectory$/python
Arguments: -m black $FilePath$
Working directory: $ProjectFileDir$

Включить Auto-save edited files to trigger the watcher. Теперь сохранение файла запускает Black.

Пример использования autopep8 с опцией --aggressive

Пример
autopep8 --in-place --aggressive --aggressive script.py

Двукратное агрессивное форматирование может изменить больше, чем обычное, включая разбивку строк.

Форматирование кода Python - comments

En
Format python code (python)