Pythonでも型を意識したプログラミングを! 型アノテーションを使おう

Python

こんにちは。龍野情報システム東京チームです。
今回の記事では、「Python3.6から導入された型アノテーション」についてご紹介します。
突然ですが、皆さんPythonでプログラムを書くときに「型」を意識していますか?(「意識していない」という人は少数かもしれません)

Pythonなどの動的型付け言語の場合、変数などの型は言語側で「なんとなく、いい感じに」してくれます。
意識せずに書くことができるのは良いところでもあるのですが、ソースコードの規模が大きくなってくると
「あれ?この関数の戻り値ってリストだっけ?辞書だっけ?」
「このライブラリのこのプロパティって文字列だっけ?」
のようにコーディング以外の部分で時間を費やしてしまいます。

そこで、Python3.6から導入された「型アノテーション」の出番です。
他の動的型付け言語(PHPなど)ではすでに実装されている機能なのですが、Pythonでも変数に型に関するコメントをつけることができるようになりました。

  • 1.コードの使い方
  • 2.アノテーションを使うときの注意点
  • 3.終わりに

 

コードの使い方

早速実際のコードで使い方を確認してみます。

変数アノテーション

変数アノテーションとはPythonで変数の型を明示的に書く方法です。
まずはかんたんなHello worldのコードです。

str1 = 'Hello world!'
print(str1)

変数 str1 は文字列型(str型)です。このレベルであれば型アノテーションは不要なのですが、あえて型アノテーションを利用してみます。

str1 :str = 'Hello world!'
print(str1)

このように 変数名 :変数型という記述をすることで「その変数がどの型なのか」を明示することができます。
 

関数アノテーション

先程は変数に対して型の注釈を付加しましたが、関数の戻り値や引数に対しても注釈をつけることができます。(関数アノテーション)

これを使いこなすと非常に開発効率が上がります。特に戻り値の型アノテーションをつけておくと、Visual Studio Codeなどのエディター上で戻り値の型をかんたんに確認できるようになります。

▼関数アノテーションの書き方
1.関数の引数に期待する型は、引数の後に、コロン:を付けて示す。
2.戻り値に期待する型は、引数の閉じカッコの後に、矢印->を付けて示す。

では、実際に役立ちそうな事例を紹介します。

import datetime
def get_todays_date() -> str:
  dt_now = datetime.datetime.now()
  date :str = dt_now.strftime("%m月%d日")
  return date

today = get_todays_date()
print("今日は", today, "です")

上記のプログラムの場合、関数 get_todays_date がdatetimeオブジェクトでreturnするのかstr型でreturnするのかの区別がつきません。
そこで、関数アノテーションを利用し、 -> str としておくと、get_todays_date の戻り値がstr型であることがひと目で分かります。かなり見通しが良くなったのではないでしょうか。
 

アノテーションを使うときの注意点

便利な型アノテーションですが、注意点があります。
まず、利用しているPython 3.6以上であることが必須です。利用しているシステムやパッケージの依存関係問題でバージョンを上げられない場合は利用できません。
また、他の言語と違い、型アノテーションはあくまでコメントとして実装されているため、実際の型とアノテーションの型がズレていても、文法上正しければプログラムは動きます。そのため、リファクタリングした際にズレが発生する可能性があります。アノテーションの直し忘れには注意しましょう。
以上、Pythonで型アノテーションを利用する方法の簡単な説明でした。
 

終わりに

プログラムは文章と同じで、「読み易さ」が求められます。

適切にコードに説明を加えることは、読み易さだけでなく、コードの価値まで左右します。
コメントは最も汎用的な方法ですが、今回の記事では、関数の説明に便利な「変数アノテーション・関数アノテーション」についてご紹介しました。

jaJapanese