
Python_型(タイプ)ヒントの書き方と検証方法 #205日目
本日はPythonでチーム開発する際に必要な「タイプヒント」に関してまとめて見たいと思います。
Pythonにはint型やfloat型、str型など、文字の型が存在しています。そして意図した型と別の型が入力されたりすると、プログラムが正常に動作しない等のエラーが起こりうるので、どの型を使っているのか明示されているととても便利です。
そのためPythonでは「タイプヒント」として、各変数で想定している型を明示することができます。例えば以下のような書き方です。
# タイプヒントなし
price = 1000
tax = 1.1
# タイプヒントあり
price: int = 1000
tax: float = 1.1
priceはint型を、taxはfloat型をそれぞれ想定した変数だと言えます。これは関数の引数に対しても使用できます。
[main.py]
# タイプヒント無し
def calc_price_including_tax(price, tax):
return int(price*tax)
# タイプヒントあり
def calc_price_including_tax(price: int, tax: float) -> int:
return int(price*tax)
「-> int」は、戻り値の型を指しています。ここではreturnで返される「int(price*tax)」はint型を想定してますよ、という意味です。ちなみに戻り値を返さない関数の場合、「-> None」とします。
例
# 戻り値を返さない館数の場合 (returnではなくprintになってる等)
def calc_price_including_tax(price: int, tax: float) -> None:
print int(price*tax)
ただ、色々書きましたが、このタイプヒントはあくまでアノテーション(注釈)であるため、指定した型と別の型が入力されてもエラーは起きません。※「price: int」にfloat型を入力する等
型通りの記述になっているか検証したい場合は外部ツールを活用します。ここでは有名な「mypy」というライブラリを使ってみます。
まずはpipインストールします。
pip install mypy
インストールできたら、以下のmain.pyに対して使ってみます。
[main.py]
price: int = 1000
tax: float = 1.1
def calc_price_including_tax(price: int, tax: float) -> int:
return int(price*tax)
if __name__ == "__main__":
print(f'税込み価格:{calc_price_including_tax(price, tax)}円')
$ mypy main.py
#出力結果
Success: no issues found in 1 source file
エラーが見つからなかったので、全て型通りに記述されているようです!
わざと型を変えてみます。priceの入力値をfloat型にしてみます。
[main.py]
price: int = 1000.1 # 小数点以下を加えてfloat型にする
tax: float = 1.1
def calc_price_including_tax(price: int, tax: float) -> int:
return int(price*tax)
if __name__ == "__main__":
print(f'税込み価格:{calc_price_including_tax(price, tax)}円')
$ mypy main.py
#出力結果
Found 1 error in 1 file (checked 1 source file)
エラーが見つかりました!
これは便利ですね。
最後に、リストや辞書でのタイプヒントの書き方をメモしておきます。これにはtypingというタイプヒントを提供しているライブラリを活用します。
from typing import List, Dict
sample_list: List[int] = [1, 2, 3, 4]
sample_dict: Dict[str, str] = {'username': 'YM202110'}
ここまでお読みいただきありがとうございました!!