Python3でも型に縛られて生きていたい
Pythonは動的型付け言語ですが…
Pythonは動的型付け言語です。個人で開発する場合は動的型付けでも問題ないかもしれませんが、チーム開発だとどうしても静的型付けのほうが楽なのではないかと思います(私は静的型付けのほうが好きです)
全員がリーダブルコードを理解してコードを書いているとは思えないですし、動的型付け言語の場合は変数名で中身を予想するしかないですからね。結構悲惨なことになったりします。
Python3(2.xは旧石器時代の遺物)を完全な静的型付け言語にすることはできませんが、少し手を加えることで型検査を行うことができます。
型検査を導入することで、うっかりミスを減らすことができるので有用かと思います。
型ヒント(Type hinting)
Python3.5から導入された機能として、型ヒントがあります。
詳しいことが気になるならPEP484を参照してみましょう。
いくつかコードの例を挙げてみます。
# 型ヒントがある場合
def fuga(x: int) -> int:
return x + 10
hoge: int = 100
print(fuga(hoge))
# 型ヒントがない場合
def fuga(x):
return x + 10
hoge = 100
print(fuga(hoge))
Swiftっぽくなりましたね
これくらいの規模では型ヒントの恩恵は感じにくいですが、チームでそこそこ大規模開発をやっているとありがたみをひしひしと感じます。
リストについても型ヒントを活用することができます。
from typing import List
kyomu: List[str] = []
kyomu.append("きょむ")
print(kyomu)
DictやDequeなども型ヒントを活用できます。詳しくはtypingを参照してください。
mypyで静的型チェックをしよう
mypyは静的型検査器です。型アノテーションをもとに型検査をしてくれます。
mypyで型チェックををすると、例えばこういう指摘をしてくれます。
from typing import List
kyomu: List[str] = []
kyomu.append("きょむ")
kyomu.append(1) # Argument 1 to "append" of "list" has incompatible type "int"; expected "str" mypy(error)
# 型が合ってないよって怒られた
print(kyomu)
hoge: str = "fuga"
hoge = 1 # Incompatible types in assignment (expression has type "int", variable has type "str") mypy(error)
VSCodeと型チェック
私はVSCode派(Vimも使います)なので、VSCodeでmypyが使えるようにします。
拡張機能のほうのPythonが入っている前提で話を進めます。
settings.jsonを開いて設定を追加しましょう。
"python.linting.mypyEnabled": true
これでVScodeでmypyが使えるようになりました。やったね!
おわりに
mypyはいいぞ