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 поможет вам писать красивый и чистый код, соответствующий многочисленным стандартам.
Метки:
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 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

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