В эпоху все большей популярности различных 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. Lelik13a
    20.03.2017 06:30
    +1

    Спасибо, интересная штука. Только в статье вы зря привязывались к какому-то IDE, yapf прекрасно работает и в качестве консольной утилиты. Прогнал по своим винегрет-поделкам, доволен результатом.


    1. alexhouse
      20.03.2017 06:35

      Консольный вариант действительно хорош, но многие привыкли писать код в IDE, и на этом примере было легче показать, как работает YAPF.


  1. gimntut
    20.03.2017 07:05

    На Windows установка делается так же?
    Или это и было про Windows?


    1. alexhouse
      20.03.2017 07:54

      Это и было про Windows.
      На Linux разница будет лишь в полном пути до yapf, в файле настроек. На *nix рекомендую использовать yapf в качестве консольной утилиты — https://github.com/google/yapf#id4


  1. weirded
    20.03.2017 08:21

    И чем вам старый добрый autopep8 не угодил?


    1. alexhouse
      20.03.2017 08:40

      autopep8 отличный инструмент в плане правки ошибок. Но YAPF дает больше возможностей для работы с кодом в плане стилизации. Например можно использовать свои правила по оформлению каких-то блоков кода, или управлять правилами написания кода, принятые в вашей компании. Плюс тут есть возможность использовать встроенные правила стилизации — pep8, google или другие.
      Для себя в YAPF я увидел отличный вариант stylelint (https://stylelint.io/) для Python.


  1. el777
    20.03.2017 08:36
    +1

    Я его вкрутил в pre-commit hook в git.
    Прекрасно работает:
    1) перед коммитом каждая правка проверяется — забыть сделать или пропустить по лени нельзя
    2) если он отредактировал код, то коммит блокируется — это очень полезно для вычитывание его правок на случай, если вдруг они сломают логику
    3) все автоматически сделанные изменения хорошо видны в правках в индексе в git
    4) у всех ваших коммитеров будет все тоже самое автоматически — как только они склонируют вашу репу и настроят ее. Независимо от используемой IDE.



  1. vz10
    20.03.2017 09:27
    +1

    Автор зря пропустил важный момент, что yapf сейчас находится на стадии альфа тестирования.


    1. nikolay_karelin
      20.03.2017 21:15

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


      1. vz10
        22.03.2017 18:35

        В readme на github написано «YAPF is still considered in „alpha“ stage, and the released version may change often...»


    1. artemisia_borealis
      21.03.2017 03:08

      Да. И в этом, видимо, причина, что yapf пока не прикрутили в PyCharm


      1. nikolay_karelin
        21.03.2017 08:02

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


  1. Apokalepsis
    22.03.2017 07:26

    А есть что нибудь подобное для HTML, JS, CSS? Красиво автоматически, это очень красиво))))


    1. alexhouse
      22.03.2017 07:27

      Есть, и много чего. Для CSS рекомендую попробовать stylelint.


      1. Psychopompe
        23.03.2017 17:09

        А для С? Я знаю, звучит странно, но порой коллеги присылают свой код, оформленный в совершенно ином стиле.


        1. alexhouse
          24.03.2017 04:53

          Вот один из вариантов https://github.com/AtomLinter/linter-clang