Приветствуйте, Yapf — готовое решение, для превращения каши из строк во вполне читаемый код. И поверьте, он вам пригодится.
Большинство современных линтеров для 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 в меню настроек.
Чтобы все заработало, требуется указать, где у вас лежит файл Yapf (в моем случае, он был в папке Python)
Откройте настройки PyYapf — Settings default, скопируйте их. Потом откройте PyYapf — Settings User, вставьте скопированные правила и укажите путь до Yapf файла.
После этого можно уже использовать YAPF для форматирования кода. Нажмите Ctrl-Alt-F и код будет преобразован. По умолчанию применяются настройки PEP8.
Пример до и после.
Вы можете настроить в нем множество правил. YAPF позволяет делать гибкую настройку различных параметров, подробнее тут — https://github.com/google/yapf#id8
Надеюсь YAPF поможет вам писать красивый и чистый код, соответствующий многочисленным стандартам.
Комментарии (17)
gimntut
20.03.2017 07:05На Windows установка делается так же?
Или это и было про Windows?
alexhouse
20.03.2017 07:54Это и было про Windows.
На Linux разница будет лишь в полном пути до yapf, в файле настроек. На *nix рекомендую использовать yapf в качестве консольной утилиты — https://github.com/google/yapf#id4
weirded
20.03.2017 08:21И чем вам старый добрый autopep8 не угодил?
alexhouse
20.03.2017 08:40autopep8 отличный инструмент в плане правки ошибок. Но YAPF дает больше возможностей для работы с кодом в плане стилизации. Например можно использовать свои правила по оформлению каких-то блоков кода, или управлять правилами написания кода, принятые в вашей компании. Плюс тут есть возможность использовать встроенные правила стилизации — pep8, google или другие.
Для себя в YAPF я увидел отличный вариант stylelint (https://stylelint.io/) для Python.
el777
20.03.2017 08:36+1Я его вкрутил в pre-commit hook в git.
Прекрасно работает:
1) перед коммитом каждая правка проверяется — забыть сделать или пропустить по лени нельзя
2) если он отредактировал код, то коммит блокируется — это очень полезно для вычитывание его правок на случай, если вдруг они сломают логику
3) все автоматически сделанные изменения хорошо видны в правках в индексе в git
4) у всех ваших коммитеров будет все тоже самое автоматически — как только они склонируют вашу репу и настроят ее. Независимо от используемой IDE.
vz10
20.03.2017 09:27+1Автор зря пропустил важный момент, что yapf сейчас находится на стадии альфа тестирования.
nikolay_karelin
20.03.2017 21:15Здесь пишут, что бета. В файле setup.py в репозитории — то же самое.
vz10
22.03.2017 18:35В readme на github написано «YAPF is still considered in „alpha“ stage, and the released version may change often...»
artemisia_borealis
21.03.2017 03:08Да. И в этом, видимо, причина, что yapf пока не прикрутили в PyCharm
nikolay_karelin
21.03.2017 08:02Насколько я знаю, к PyCharm многое медленно прикручивают, потому, что питонисты не сильно жалуют Яву і наоборот :)
Apokalepsis
22.03.2017 07:26А есть что нибудь подобное для HTML, JS, CSS? Красиво автоматически, это очень красиво))))
alexhouse
22.03.2017 07:27Есть, и много чего. Для CSS рекомендую попробовать stylelint.
Psychopompe
23.03.2017 17:09А для С? Я знаю, звучит странно, но порой коллеги присылают свой код, оформленный в совершенно ином стиле.
Lelik13a
Спасибо, интересная штука. Только в статье вы зря привязывались к какому-то IDE, yapf прекрасно работает и в качестве консольной утилиты. Прогнал по своим винегрет-поделкам, доволен результатом.
alexhouse
Консольный вариант действительно хорош, но многие привыкли писать код в IDE, и на этом примере было легче показать, как работает YAPF.