Kesinの知見置き場

知見を共有していきたいじゃないですか

Python3.5の型ヒントをとりあえず試す

Python3.5がリリースされましたね。
Python書くのはほぼ1年ぶりでしたが、噂の型ヒントがついに3.5で導入されたようなので早速試してみました。

型ヒントについてこちらに素晴らしいPEPの翻訳記事があり、見て頂けると分かりますがPython3.5単独ではまだ型チェックはできません。 標準モジュールに入ったのは型ヒントを与えるためのtypingモジュールであり、そのヒントを基にチェック型チェックを行えるのは(現状では)mypyというサードパーティのモジュールになります。

mypy

Pythonの型ヒントは今のところ実行時に型チェックをしたりJITのためにするためのものではなく、mypyも静的に型チェックを行うLintツールです。

ちなみにmypyをインストールするにはmypy-langという名前でpip installする必要があるので注意。pip install mypyでインストールされるモジュールは全然別物のようです(紛らわしい・・・)

最近エディタとして使っているatomにはまだプラグインが存在していないのか、mypyを使うLinterは見つけられませんでした。
vimプラグインのsyntasticを見るとmypy用の設定があるように見えるのですが、なぜか自分の環境では動かなかったので一旦エディタから使うことを諦めました。

とりあえずgit hooksでmypyを試す

エディタのプラグインは諦めたので、代わりにgit hookに仕込んで最低限の自動チェックを入れてみました。
CIツールを用意しなくても普通にgitでコードを管理していれば絶対に実行されるので、mypyに限らずcommitフックでチェックするのはオススメです。

# .git/hooks/pre-commit

STATUS=0
for file in `git diff HEAD --name-only | grep -E '.py$'`; do
    mypy $file || STATUS=255
done

exit $STATUS

所感

個人の小さなプロジェクト(クラスが1-2個程度)で試して気になった点

  • Atomシンタックスハイライトが関数アノテーションを入れると壊れるのが辛い
    • Vimはちゃんとハイライトしてくれた
  • 関数アノテーションは見た目的にはさほど問題無いが、変数宣言の行末に# type: intとかが並ぶと見た目がうっとおしい
  • mypyがimport文でerror: No module named **とめちゃ怒るのがウザい
    • とりあえず# type: ignoreを付けることでエラーを抑制できる
    • 標準モジュールはスタブを用意すれば問題ないらしいが、サードパーティモジュールは今後もignore書く必要があるのだろうか・・・

個人プロジェクト程度のコード量だと全体を把握できているので、自作クラスにわざわざ型を付けるメリットはあまりなさそうかなという感じでした。

個人規模のものはサードパーティモジュールに依存する部分が広くなるため、有名どころのモジュールがいかに対応するかが普及には重要そう。
逆に企業のコードは自作モジュールに依存する部分が広いと思いますので、自前で型情報を付ける必要があるコード量が多くなる。 という事情を考えると、型ヒントを書くのが一般的になるとしても結構時間がかかりそうですね。
(そういう未来が来ない可能性の方が高そう)

参考