注目キーワード

【Python】関数の引数や返り値に説明を付けるアノテーションの使い方

Pythonではデータの型を明示的に書く必要がなく、いろんなデータ型(数値、リスト、辞書、など)を自由に使うことができます。その一方で、利用している変数が何を格納しているのか分かりづらくなるときもあり、注意を払う必要があります。

アノテーションとは

アノテーションとは日本語では注釈のことで、元々は専門用語に補足的な説明や解説を付け加えるもののことです。Pythonではアノテーションを使うことで、変数や関数の引数・返り値などに説明を付け加えることができます。

プログラムを自分や他の人が読んでも分かりやすくしたり、後ほど修正しやすくしたりするために「コメント」を書き加えることがあると思います。変数や関数をより詳しい注釈を付けて読みやすいものにするために、Pythonではコメントだけではなく、変数や関数に対するアノテーションを付けることができます。アノテーションによって、変数のデータ型や意味、関数の使い方を更に分かりやすくすることができます。この記事では、例を見てアノテーションの使い方を説明します。

準備(インストール)

こちらの記事では mypy というパッケージを利用します。インストールされていない場合には、pip install mypy でインストールしてください。

変数に対するアノテーションの使い方

アノテーションを付ける場合、変数の後ろに「:」をつけ、その後ろにアノテーションを付けます。一番簡単な例から見てみましょう。

サンプルソース

ここでは3つの変数 x, y, z に数値を代入しています。変数の後ろにはアノテーションが付いています。

x のアノテーションには文字列で「これが変数です」と書いてあります。このアノテーション部分は実行には影響を与えないため特に意味のない部分ですが、記録を残すことができます。

y と zのアノテーションには、pythonのデータ型として int と float を付与してみました。それぞれ値としては 10 と 0.5 を代入しました。ここで z は int とアノテーションが付いているにも関わらず小数値が代入されていますが、アノテーションは実行に影響を与えないので、特に問題なく動作します。

実行結果

実行結果です。アノテーションに影響されず、printが実行されました。

アノテーション付きソースコードの実行結果

こうして実行結果をみると「アノテーションはいらないのでは?」という気持ちになるかもしれません。アノテーションを有効活用する1つの方法が型ヒントであり、 y や z のようにPythonのデータ型を使ったアノテーションを付与することで、プログラムのメンテナンス性を向上したり、人が理解しやすくなるようになります。

ここで付与したアノテーションを型ヒントとして利用してプログラムをチェックするため、インストールした mypy を python の代わりに利用して実行してみます。結果は次のようになります。

アノテーション付きソースコードをmypyで確認した結果

結果より x に文字列で付けたアノテーションは型ヒントとしては不適切であること、また int とヒントを付けた z に int ではない値の0.5が代入されており不適切であること、が確認できました。こうして型ヒントによってプログラムを確認することができることが分かりました。

関数に対するアノテーションの使い方

先程の例では変数にのみ扱いましたが、関数と返り値についても「->」としてアノテーションを書くことができます。

サンプルソース

サンプルの実装です。

実行結果

スポンサーリンク

まずはpythonで実行した場合の結果です。1+2の足し算が実行されたことが分かります。先程確認した通り、pythonのアノテーションに何が書かれていても結果には影響してこないので、いずれも3(最後だけ3.0)を出力しています。

アノテーション付きの関数を実行するコードの実行結果

先程の例のように、同じプログラムを mypy でチェックしてみましょう。

アノテーション付きの関数を実行するコードをmypyで確認した結果

このような結果が出力されました。

4行目のエラーは、先程と同じく型ヒントのアノテーションが不適切であることを示しています。

14行目のエラーは、intとして想定されていた引数に対して、int以外の値(ここでは1.0や2.0のこと)が入力されていることを示しています。

このようにアノテーションや型ヒントを適切に利用することで、プログラムの動作確認が少しやりやすくなります。型ヒントのより一般的な使い方についてはまた別の記事で説明するかもしれません。これからはコメントだけではなくアノテーションもしっかり活用して、読みやすく再利用しやすいコードを書いていきましょう。