用Vim寫Python,曾是一件流行的事,而今已經變得小眾。 實際上,Vim仍然是Python開發的最佳利器之一,在很多方面,甚至優於PyCharm這樣的IDE。
本文會基於Vim,介紹Python的風格統一與格式化方法。 並且,還會集成它們到pytest中去。
Golang的出現,改變了很多事。 它從Python中學走了編程風格、代碼規範的固化,畢竟這關乎優雅。 Python的固化,跟多還停留在規範層面,如PEP8。 Golang從一開始就更進一步,用gofmt把這種固化做成了源文件格式化。
這固然帶來了很多爭議,但也帶來了很多便利。 這些便利可以總結為一句話——結束了關於風格與規範的聖戰。
yapf就是在gofmt的思路下,反饋給Python社區的禮物。 可以在YAPF Online Demo中,試用yapf並查看效果。
yapf只專註于格式化,而不會去修改內容和順序。 這在大部分區域都沒問題,但在import區域,卻顯得不足。 在Pylint下,Python的import,也需要像Java那樣有確定的順序和分組,而yapf無能為力。 這就是isort的領域。
import
isort會把import分成標準庫、第三方庫、本地庫三種,分別按字母排序。 格式化的結果,能自動滿足Pylint的需要。 實際上,它本身就是Pylint的一個依賴。
更難得的是,isort自己提供了一個Wiki——isort Plugins · timothycrosley/isort Wiki——介紹了如何給幾種流行的編輯環境配置插件。
pip install yapf isort
安裝很簡單,命令行使用也很方便,可以自行查看--help。 這裡談談兩種配置到Vim的兩種方法。
--help
以下為基於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來,在通用性上,還是略顯不足。
Plugin w0rp/ale let g:ale_fixers = { python: [yapf, isort], } noremap <F2> :ALEFix<CR>
以上配置為真實ale配置的一個簡化版。 它比上一個插件方案看上去清晰多了,並且很容易兼容更多fixer、更多語言。
(ale本身是一個很大的話題,這裡不多介紹。)
yapf配置與優先順序:
[style]
.style.yapf
[yapf]
setup.cfg
~/.config/yapf/style
isort配置:
.isort.cfg
[settings]
tox.ini
[isort]
pyproject.toml
[tool.isort]
~/.isort.cfg
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衝突問題。
既然談到固化,就要有檢查。 如果兩個人開發同一個文件,一個人有做文件格式化,另一個沒有,那麼前者就經常會自動修改後者的代碼,帶來不必要的衝突; 如果兩個人的格式化配置不一樣,那麼故事就更精彩了。
用相同的配置建立同一的標準,並且在每一次commit都去檢查它,這才是完整的方案。 而pytest能實現這個方案。
在setup.py的tests_require中,或者requirements.txt中,添加pytest-isort和pytest-yapf,並且安裝它們。 然後,配置setup.cfg。
setup.py
tests_require
requirements.txt
[tool:pytest] addopts = --verbose --isort --yapf ... isort_ignore = setup.py
[isort] ...
[yapf] ...
這裡,主要是添加--isort和--yapf到已有的pytest配置中。 pytest-isort還支持isort_ignore,忽略不需要檢查的文件; pytest-yapf還不支持這個功能。
--isort
--yapf
isort_ignore
配置完成後,一切盡在pytest。
pytest
終於可以像寫Golang那樣去寫Python了。
咦?那為什麼……
原文鏈接:
TAG:Vim | pytest |