標籤:

配置yapf和isort的Vim與Pytest插件

用Vim寫Python,曾是一件流行的事,而今已經變得小眾。 實際上,Vim仍然是Python開發的最佳利器之一,在很多方面,甚至優於PyCharm這樣的IDE。

本文會基於Vim,介紹Python的風格統一與格式化方法。 並且,還會集成它們到pytest中去。

yapf簡介

Golang的出現,改變了很多事。 它從Python中學走了編程風格、代碼規範的固化,畢竟這關乎優雅。 Python的固化,跟多還停留在規範層面,如PEP8。 Golang從一開始就更進一步,用gofmt把這種固化做成了源文件格式化。

這固然帶來了很多爭議,但也帶來了很多便利。 這些便利可以總結為一句話——結束了關於風格與規範的聖戰。

yapf就是在gofmt的思路下,反饋給Python社區的禮物。 可以在YAPF Online Demo中,試用yapf並查看效果。

isort簡介

yapf只專註于格式化,而不會去修改內容和順序。 這在大部分區域都沒問題,但在import區域,卻顯得不足。 在Pylint下,Python的import,也需要像Java那樣有確定的順序和分組,而yapf無能為力。 這就是isort的領域。

isort會把import分成標準庫、第三方庫、本地庫三種,分別按字母排序。 格式化的結果,能自動滿足Pylint的需要。 實際上,它本身就是Pylint的一個依賴。

更難得的是,isort自己提供了一個Wiki——isort Plugins · timothycrosley/isort Wiki——介紹了如何給幾種流行的編輯環境配置插件。

安裝與配置插件

pip install yapf isort

安裝很簡單,命令行使用也很方便,可以自行查看--help。 這裡談談兩種配置到Vim的兩種方法。

vim-autoformat與vim-isort

以下為基於Vundle.vim的插件配置。

Plugin Chiel92/vim-autoformat
let g:formatter_yapf_style = pep8
Plugin fisadev/vim-isort
noremap <F2> :Autoformat<CR>:Isort<CR>

vim-autoformat是一個通用的Vim格式化插件,它通過yapf對Python提供支持。 vim-isort則是一個簡單的,專為isort而生的插件。

最後,這裡配置了作為格式化快捷鍵。

ale

以上的兩個插件,無疑是能用的,我也用了很長時間。 但比起ale來,在通用性上,還是略顯不足。

Plugin w0rp/ale
let g:ale_fixers = {
python: [yapf, isort],
}
noremap <F2> :ALEFix<CR>

以上配置為真實ale配置的一個簡化版。 它比上一個插件方案看上去清晰多了,並且很容易兼容更多fixer、更多語言。

(ale本身是一個很大的話題,這裡不多介紹。)

配置

yapf配置與優先順序:

  1. Specified on the command line
  2. In the [style] section of a .style.yapf file in either the current directory or one of its parent directories.
  3. In the [yapf] section of a setup.cfg file in either the current directory or one of its parent directories.
  4. In the ~/.config/yapf/style file in your home directory.

isort配置:

  • 局部配置有三種(優先順序不明)
    • .isort.cfg,使用[settings]區域
    • setup.cfgtox.ini,使用[isort]區域
    • pyproject.toml,使用[tool.isort]區域
  • 全局配置~/.isort.cfg,使用[settings]區域

yapf和isort,雖然都有還不錯的默認配置,但也不能完全不調整。 尤其是,它們會格式化同一區域,會有一些衝突情況,比如最後一個import的comma(,)。 雖然它倆都有各自的配置文件與優先順序,但本地配置中都支持setup.cfg。 所以,推薦在項目的setup.cfg中進行配置,固化在項目中。

[isort]
line_length = 79
multi_line_output = 3
include_trailing_comma = true

[yapf]
based_on_style = facebook
coalesce_brackets = true
dedent_closing_brackets = true

以上為我的個人配置,至少解決了已知的comma衝突問題。

集成到pytest

既然談到固化,就要有檢查。 如果兩個人開發同一個文件,一個人有做文件格式化,另一個沒有,那麼前者就經常會自動修改後者的代碼,帶來不必要的衝突; 如果兩個人的格式化配置不一樣,那麼故事就更精彩了。

用相同的配置建立同一的標準,並且在每一次commit都去檢查它,這才是完整的方案。 而pytest能實現這個方案。

setup.pytests_require中,或者requirements.txt中,添加pytest-isort和pytest-yapf,並且安裝它們。 然後,配置setup.cfg

[tool:pytest]
addopts = --verbose
--isort
--yapf
...
isort_ignore = setup.py

[isort]
...

[yapf]
...

這裡,主要是添加--isort--yapf到已有的pytest配置中。 pytest-isort還支持isort_ignore,忽略不需要檢查的文件; pytest-yapf還不支持這個功能。

配置完成後,一切盡在pytest

結語

終於可以像寫Golang那樣去寫Python了。

咦?那為什麼……

原文鏈接:

配置yapf和isort的Vim與Pytest插件 · 零壹軒·筆記?

note.qidong.name圖標
推薦閱讀:

TAG:Vim | pytest |