20 марта в 05:33

Yapf — причесываем код Python автокорректором tutorial

В эпоху все большей популярности различных js и css linter'ов, не удивительно появление удобного линтера с автокоррекцией для Python.

Приветствуйте, Yapf — готовое решение, для превращения каши из строк во вполне читаемый код. И поверьте, он вам пригодится.

image

Большинство современных линтеров для Python — например, autopep8 и pep8ify — сделаны, чтобы удалить ошибки в коде. Это имеет некоторые очевидные ограничения. Например, код, который соответствует PEP8, не может быть переформатирован. Но это не значит, что код выглядит хорошо.

YAPF использует другой подход. Он основан на «clang-format», разработанном Daniel Jasper. В сущности, алгоритм берет код и переформатирует его до формата, соответствующего стилю руководства, даже если исходный код не нарушает руководство по стилю. Идея также похожа на инструмент gofmt для языка программирования Go: конец всех священных войн о форматировании — если вся кодовая база проекта просто перекачивается через YAPF всякий раз, когда вносятся изменения, стиль остается согласованным во всем проекте, и нет смысла спорить о стиле в каждом обзоре кода.

Конечная цель состоит в том, что код python c YAPF пишется так же хорошо, как код, который мог бы написать программист, если бы следовал руководству по стилю. Это избавляет от тяжелой работы по поддержке кода.

А теперь перейдем к практической части:

YAPF можно использовать как из командной строки, так и в виде плагина для текстового редактора. Сейчас есть плагины для Emacs, VIM и Sublime Text.

Я в основном использую Sublime Text, поэтому покажу как его настроить для использования YAPF.
Плагин для Sublime Text — github.com/jason-kane/PyYapf

1. Установка.

pip install yapf

Установите Sublime Package Control, следуя инструкциям здесь (если вы еще этого не сделали).

Ctrl-Shift-P (Mac: Cmd-Shift-P) и выберите «Управление пакетами: установить пакет».

Найдите в списке «PyYapf Python Formatter».

2. Настройка.

После установки у вас появится PyYapf в меню настроек.

image

Чтобы все заработало, требуется указать, где у вас лежит файл Yapf (в моем случае, он был в папке Python)

Откройте настройки PyYapf — Settings default, скопируйте их. Потом откройте PyYapf — Settings User, вставьте скопированные правила и укажите путь до Yapf файла.

image

После этого можно уже использовать YAPF для форматирования кода. Нажмите Ctrl-Alt-F и код будет преобразован. По умолчанию применяются настройки PEP8.

Пример до и после.

image

Вы можете настроить в нем множество правил. YAPF позволяет делать гибкую настройку различных параметров, подробнее тут — https://github.com/google/yapf#id8

Надеюсь YAPF поможет вам писать красивый и чистый код, соответствующий многочисленным стандартам.
Александр @alexhouse
карма
7,0
рейтинг 2,4
Веб-разработка / Python
Похожие публикации
Самое читаемое Разработка

Комментарии (17)

  • +1
    Спасибо, интересная штука. Только в статье вы зря привязывались к какому-то IDE, yapf прекрасно работает и в качестве консольной утилиты. Прогнал по своим винегрет-поделкам, доволен результатом.
    • 0
      Консольный вариант действительно хорош, но многие привыкли писать код в IDE, и на этом примере было легче показать, как работает YAPF.
  • 0
    На Windows установка делается так же?
    Или это и было про Windows?

    • 0
      Это и было про Windows.
      На Linux разница будет лишь в полном пути до yapf, в файле настроек. На *nix рекомендую использовать yapf в качестве консольной утилиты — https://github.com/google/yapf#id4
  • 0
    И чем вам старый добрый autopep8 не угодил?
    • 0
      autopep8 отличный инструмент в плане правки ошибок. Но YAPF дает больше возможностей для работы с кодом в плане стилизации. Например можно использовать свои правила по оформлению каких-то блоков кода, или управлять правилами написания кода, принятые в вашей компании. Плюс тут есть возможность использовать встроенные правила стилизации — pep8, google или другие.
      Для себя в YAPF я увидел отличный вариант stylelint (https://stylelint.io/) для Python.
  • +1
    Я его вкрутил в pre-commit hook в git.
    Прекрасно работает:
    1) перед коммитом каждая правка проверяется — забыть сделать или пропустить по лени нельзя
    2) если он отредактировал код, то коммит блокируется — это очень полезно для вычитывание его правок на случай, если вдруг они сломают логику
    3) все автоматически сделанные изменения хорошо видны в правках в индексе в git
    4) у всех ваших коммитеров будет все тоже самое автоматически — как только они склонируют вашу репу и настроят ее. Независимо от используемой IDE.
  • +1
    Автор зря пропустил важный момент, что yapf сейчас находится на стадии альфа тестирования.
    • 0

      Здесь пишут, что бета. В файле setup.py в репозитории — то же самое.

      • 0
        В readme на github написано «YAPF is still considered in „alpha“ stage, and the released version may change often...»
    • 0
      Да. И в этом, видимо, причина, что yapf пока не прикрутили в PyCharm
      • 0

        Насколько я знаю, к PyCharm многое медленно прикручивают, потому, что питонисты не сильно жалуют Яву і наоборот :)

  • 0
    А есть что нибудь подобное для HTML, JS, CSS? Красиво автоматически, это очень красиво))))
    • 0
      Есть, и много чего. Для CSS рекомендую попробовать stylelint.
      • 0
        А для С? Я знаю, звучит странно, но порой коллеги присылают свой код, оформленный в совершенно ином стиле.
        • 0
          Вот один из вариантов https://github.com/AtomLinter/linter-clang

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.