Vimで始める型付きPython3開発

型付きPythonは静的型解析ツールであるmypyによる検査と、jediによる補完が効くという開発に役立つ便利な恩恵があります。

実行時には(まだ)型の恩恵はないですが始めるには十分な恩恵だと感じたので始めてみました。


venvとmypyを使うので、Python3と言ってもPython3.5(現在の最新版)を使います。

スタイルチェックにはflake8を使用します。

Vim(Neovim)の準備

:echo has('python')
:echo has('python3')

コマンドが1を返すことを確認します。もし0の場合は、Pythonを有効にします(有効にする方法は"vim python 有効"で検索)。

Python3.5のインストール

※Python3.6も出るみたいなので適宜その時の最新版をインストールしてください

パッケージマネージャーでインストールするとPython3.5が入って便利かつ簡単です。

macOS

$ brew install python3
$ python3 --version
3.5.2

ubuntu16.04

% sudo apt-get install python3
% python3 --version

Windows

パッケージマネージャがあるのかもしれませんが詳しくないので、インストーラからPython3.5をインストールします。

必要なパッケージのインストール

UbuntuとWindowsでは管理者権限が必要になるので、それぞれsudoをつける、管理者権限でcmdを起動してください。

$ pip3 install -U flake8 mypy-lang jedi

それぞれ

  • flake8はスタイルチェッカー
  • mypyは静的型解析
  • jediは補完エンジン

です。

mypyは型付きPythonに必須のツールです。

python/mypy: Optional static typing for Python 2 and 3 (PEP484)

後述するsyntasticやneomakeと組み合わせて使うとファイル編集時に型チェックができてとても良いです。

typeshedにてライブラリや3rd-partyパッケージの型にも対応しようとしていて今後の発展に注目です。

(たとえばFlaskは現在対応中のようです(help wanted by Guido...) => Stub for flask · Issue #28 · python/typeshed)

次にflake8ですが、スタイルチェッカーにはpylintやhackingなどがありますがflake8を選びました。理由は、

  • flake8で十分と感じた
  • flake8だけでも割りと遅いので併用したくない

ということでflake8単体で使っています。

しかもsyntasticを使用した場合、非同期に実行されないのでスタイルチェッカーが重いと結構なストレスになりそうです。

環境構築(venv)

デフォルトでvenvが同梱されているのでそちらを使います。

$ mkdir progect
$ pyvenv project
$ cd project
$ source bin/activate

Warning

activateファイルにfishスクリプトも用意されているのですが、"$(var)"を使っていてエラーになるので該当部分を"(var)"に修正すれば動きます。

pyvenvコマンドをすると色々ファイルが作られるのでgitignoreしたくなります。

GitHub公式のgitignoreを使うと良いです。

この2つを組み合わせればPythonのgitignoreは多くのケースで十分そうです。

後者の方はGlobalのgitignoreに入れると良いようです。

Neovim/Vimの設定

flake8とmypyのスタイルチェックをSyntasticまたはNeomakeで行い、jediで補完します。

型チェック & スタイルチェック

syntasticまたはneomakeを使って、ファイル保存時にチェックします。

インストール方法は各プラグインマネージャなどに従って下さい。

Python用の設定は以下のように書きます。

syntastic↓

let g:syntastic_python_checkers = ['python', 'flake8', 'mypy']

neomake↓

let g:neomake_python_enabled_makers = ['python', 'flake8', 'mypy']

参考までに私の設定です。プラグインマネージャにはdein.vimを使ってtomlファイルでプラグインを管理しています、Neovimのときはneomake、Vimのときはsyntasticを使っています。

(neomakeはNeovim専用ではなくVim8.0.0027以降であれば使えます)

[[plugins]]
repo = 'neomake/neomake'
if = "has('nvim')"
hook_add = '''
autocmd! BufEnter,BufWritePost * Neomake
let g:neomake_python_enabled_makers = ['python', 'flake8', 'mypy']
'''

[[plugins]]
repo = 'vim-syntastic/syntastic'
if = "!has('nvim')"
hook_add = '''
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
" for Python
let g:syntastic_python_checkers = ['python', 'flake8', 'mypy']
'''

補完

jediをneocomplete.vimとdeoplete.nvimから利用する方法を紹介します。

jediはType Hintsがついてると型に応じてメソッド名などを補完するのでかなり便利です。

neocomplete.vimとdeoplete.nvimのインストール方法については省略します。

neocomplete.vim

davidhalter/jedi-vim: Using the jedi autocompletion library for VIM.をプラグインを追加して以下の設定をします。

autocmd FileType python setlocal omnifunc=jedi#completions
let g:jedi#completions_enabled = 0
let g:jedi#auto_vim_configuration = 0
let g:neocomplete#force_omni_input_patterns.python = '\%([^. \t]\.\|^\s*@\|^\s*from\s.\+import \|^\s*from \|^\s*import \)\w*'

参考: jedi-vimとneocomplete.vimを併用する際に行っておきたい設定 - kozo2's blog

deoplete.nvim

zchee/deoplete-jedi: deoplete.nvim source for Pythonをプラグインに追加します。

venvを使うのでグローバルにインストールされているPythonへのパスの設定が必要です。

let g:python_host_prog = '/full/path/to/neovim2/bin/python'
let g:python3_host_prog = '/full/path/to/neovim3/bin/python'

Previewが邪魔な人向け

jediを使っているとPreviewがでてきて邪魔という方が多く見受けられます、Vimの機能なのでVim側の設定で変えられます。

Previewを出さない

set completeopt-=preview

補完終了時に自動で閉じる

autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif

など良い感じに設定すると良いです。

まとめ

型の恩恵は実行時には(まだ)ないですが、静的型チェッカー(mypy)、jediによる補完と開発に置ける恩恵はなかなかのものだと思うのでおすすめです。

紹介した方法は新しいPython1つしかインストールしてないので、古いバージョンでのデバック作業などが必要になった場合に困りそうですがそれはまた必要になってから考えようかと思ってます。とりあえず現状はCIするときにtoxで各バージョンのテストを走らせることで確認しています。

Show comments

Adsense

Share

  • このエントリーをはてなブックマークに追加

About

どこにでもいる平凡なプログラムを書く人間のログ。

Recently

Tags

Pages

-->