AI(機械学習)ブームが続いていることもあって最近はプログラム言語のPythonが注目を集めていますよね。またPythonはそのわかりやすい文法からプログラミング初心者に適した言語と言われています。
Pythonでは実行時に型を推論することから変数に型を明示的に書くことはありませんでしたが、Python3.5以降で導入されたType Hintsという仕組みによって、型アノテーションをつけることが可能になりました。
Pythonにおける型アノテーションとは、関数の引数や戻り値などに入るデータのデータ型に注釈を与える機能です。注釈と呼んでいるのは、実際に異なるデータ型が与えられたとしても特に実行には影響せず、そのまま実行されるためです。
このように少し癖のある仕組みですが、使いこなすことでプログラムの可読性を大きく高めることができるので、簡単に紹介していきます。Type HintsをマスターすることはPython初心者を卒業するのに大いに役立つでしょう。
- 本記事ではPython3.7以降での実行を想定しています。
- 本記事に出てきたコードはGitHubから見ることが出来ます。
Type Hintsを学びやすい日本語記事
実例で学ぶ Type Hints
まずは関数の引数と戻り値に対してType Hintsをつけていきます。
def greeting(name: str) -> str: return f'Hello, {name}' # type hintsなしの場合 def greeting_without_type_hints(name): return f'Hello, {name}'
従来greeting_without_type_hintsのように書いていた関数を、上のgreetingのようにType Hintsをつけることができます。
Type Hintsがあることの最も大きな利点は、その関数が予想しているデータ型が明確になることです。greetingの場合は引数nameに文字列(string)型が入り、文字列型を返す関数であることが一目でわかります。
greetingのような簡単な関数であれば型のアノテーションがなくとも容易にデータ型は想像できますが、もう少し長い関数で引数の数も増えてくるとそのようにはいきません。またそれが他のチームメンバーが書いたものであれば、さらに理解は難しくなります。
こういった場合に役に立つのがType Hintsで、予想される引数と戻り値がわかればコードの意味を理解するのに大きな助けとなります。
変数でのType Hints
また関数の引数や戻り値だけでなく、普通の変数などにも以下のようにType Hintsをつけることが出来ます。
number: int = 100 print(number)
実行結果
100
個人的には全ての変数に型をつけるのは煩わしい(可読性が下がる恐れがある)のであまり用いませんが、データ型がすぐに理解しがたい変数の場合は使用することで他者(将来の自分を含む)のコードリーディングの理解を手助けすることが出来ます。
Python組み込みのtypingパッケージ
Type Hintsが導入されてから、PythonにはType Hintsをより便利にするtypingパッケージが組み込まれています。例えば入力に[‘りんご’, ‘なし’]のような文字列のリストを想定している場合、以下のようにType Hintsを書けます。
from typing import List def print_fruit(fruit_list: List[str]) -> None: print(fruit_list)
この他にも呼び出し可能なオブジェクトを表すCallableや、イテラブルなオブジェクトを表すIterableというオブジェクトも用意されています。
- Callable[[引数の型], 戻り値の型]
- Iterable[各要素の型]
from typing import Callable, Iterable def callable_wrapper(func: Callable[[str], None], fruits_list: Iterable[string]): func(fruits_list) fruits_list = ['なし', 'みかん'] callable_wrapper(print_fruits, frutis_list)
その他詳しい説明はPythonの日本語公式ドキュメントなどを参考にしてください。
Pythonで静的に型チェックを行う
Pythonは動的型付け言語ですが、Type Hintsによってつけられた型アノテーションに関しては正しいデータが与えられているかをチェックすることが出来ます。
mypyというパッケージを用いるので、以下のコマンドでインストールします。
pip install mypy
先ほど作成したgreetingという関数に正しく文字列を与えた場合のexample_success.pyと、正しくない入力であるint型を与えた場合のexample_error.pyの両方をmypyで型チェックしてみます。
mypy example_success.py
この場合は全てのデータ型が正しく入力されているので標準出力には何も出力されません。
次は誤った入力であるint型を入れているファイルをmypyで型チェックします。
mypy example_error.py
example_error.py:5: error: Argument 1 to "greeting" has incompatible type "int"; expected "str"
上記のようにエラーが吐かれました。
「5行目で呼ばれているgreetingという関数の1つ目の引数はstr型を予想しているのに、int型が入ってきたよ。」というエラーの内容が書かれており、見事に関数の予想しない使用を事前にチェックできました。
このようにType Hintsとmypyによる型チェックを行っておくと、大きなプロジェクトになっても関数などの予想されていない使用を防ぐことができ、安全に開発を進めることが出来ます。
まとめ
さて、今回は脱Python初心者ということでPythonのType Hintsについて紹介してきました。ここまで見てきたようにType Hints単体では少し扱いに癖がありますが、mypyなどと組みわせることで可読性の高さと安全な開発とを同時に得ることができる素晴らしい機能です。
Type Hintsを知らなかった人や知っていたが使ったことのないPython初心者の人は、これを機に試してみて、さらに美しいコードが書けるようになりましょう。
プログラムの実行例
git clone https://github.com/yutayamazaki/AIZINE.git cd AIZINE cd type_hints pipenv shell cd src mypy example_success.py mypy example_error.py
コメントをどうぞ