mypyとは
コードを型アノテーションを付ける構文(PEP 484)に基づき、チェックしてくれる静的解析ツールです。
導入のモチベーション
本記事では、プログラミング初心者向けに、pythonで型指定をするモチベーションを解説します。
早速ですが、pythonでは型を指定することはできるが、厳密な型チェックは行われない。例えば、
def f(x:int) -> int:
return x
は関数fの引数xに整数が入るよと宣言していることになる。ただし、実際には
a:int = f(1)
a #1 OK
b:int = f("gggg")
b #gggg 型が違うものまで通してしまう。
型が違っても関数を実行してその結果を出してしまうので、実はpythonで型指定というものは表面的なものに過ぎない。
本来、指定された型と違う型の引数が代入されたら(上の例でいうとbに対応)、本来そこで型が違うよ!というエラーを出してほしい。
そこで、mypyを導入する。なお、
pip install mypy
でインストールできます。
mypy 〇〇.py
で〇〇を実行してあげると型をチェックしてくれる。以下の例だとエラーが出る。
value: int = 1
value = "ccc" # mypyはvalueの型が違う違うというエラーを出してくれる
#error: Incompatible types in assignment (expression has type "str", variable has type "int")
他の例として
def f(x:int) -> int:
return x
b:int = f("ggg") #mypyを使えばこのミスを防げる。
#error: Argument 1 to "f" has incompatible type "str"; expected "int"
実際の開発では、どのようにして型をつければ良いか、迷うかもしれない。
そこで、python3を使っている人ならば、mypy チートシートが参考になる。
例えば、typingというモジュールの関数にSequenceがあり、これで配列を表せる。例えば、Sequence[float]で配列に入る変数の型も指定できる。
詳細は、開発チームの方針に合わせた方が良いだろう。
余談
ちなみに、pythonと同じように書くことができるjuliaだと型チェックをデフォルトで行なってくれます。
function f(x::int)
return x
end
julia> a = f(1)
1
julia> b = f("aaaa")
ERROR: MethodError: no method matching f(::String)
julia便利ですね。ただ、ライブラリーの充実度は今の所pythonが優勢なようです。どちらも使えるようになっておくのが今のところいいような気がします。
参考記事
python3で型をつける流儀は、mypy チートシートが参考になる。
[Python の静的型、すごい mypy!]
(https://qiita.com/t2y/items/2a1310608da7b5c4860b)ß