本記事はPythonの型ヒントの書き方に関する記事です.
以下の2パターンについて確認します.
- 関数の戻り値が複数ある場合
- 引数によって戻り値が変わる場合
関数の戻り値が複数ある場合
戻り値が2つある場合の関数を見てみましょう.
何らかの文字列を引数として与えると,引数の文字と引数の文字数が返ってくる関数です.
# 型ヒントがない関数
def return_2values(moji):
return moji, len(moji)
この関数を実行して戻ってくる値を見てみます.
result = return_2values('管理人')
print(result) # 戻り値
print(type(result)) # 戻り値のデータ型
print([type(i) for i in result]) # tuple内のデータ型
('管理人', 3)
<class 'tuple'>
[<class 'str'>, <class 'int'>]
それぞれの結果は以下のとおりです.
- 戻り値:
return moji, len(moji)の結果です. - 戻り値のデータ型:
tupleとなっています. - tuple内のデータ型:それぞれ
str型,int型(='管理人', 3)です.
上記を踏まえて,型ヒントをつけてみましょう.
型ヒントをつけるにはPython組み込みのtypingモジュールを使用します.
from typing import Tuple
# 型ヒントをつけた関数
def return_2values(moji: str) -> Tuple[str, int]:
return moji, len(moji)
型ヒントをつけることで以下のような内容を表現しています.
- 引数に取るデータは
str型 - この関数を実行した結果の戻り値は
tupleで要素はstr型とint型
この程度の関数であれば型ヒントがなくてもわかりますが,複雑な関数などは型ヒントがあると理解の助けになります.
型ヒントのチェック
型ヒントの記法を判定する外部ライブラリmypyを使って関数をチェックしてみましょう.
参考
mypyをインストールしていない場合は以下のコマンドでインストール可能です.
pip install mypy
確認したい関数を.pyファイルに保存して以下のmypyコマンドでチェックを行います.
(以下の例ではhoge.pyに型ヒント付きの関数が記載されている想定です1)
mypy hoge.py
Success: no issues found in 1 source file
記法上,問題ないことが確認できました!
(もし何らかの誤りがあるとerrorが発生します)
引数によって戻り値が変わる場合
条件分岐などで関数の戻り値が変わるパターンです.
以下の関数は引数の文字数に応じて文字列(str型)か文字数(int型)を返す関数です.
from typing import Tuple, Union
def return_diff_values(moji: str) -> Union[str, int]:
if len(moji) > 5:
return moji
else:
return len(moji)
このように条件に応じて戻り値のデータ型が変わる場合,戻り値の型ヒントは以下のようにします.
Union[戻り値のパターン①, パターン②, ...]
上記の関数の場合はstr型かint型を返すのでUnion[str, int]としています.
(関数の実行によって戻ってくる値はstrかintという表現です)
参考
以下は上記の関数の実行例です.
# 「管理人」は3文字なので文字数が返ってくる
print(return_diff_values('管理人'))
print(type(return_diff_values('管理人')))
3 <class 'int'>
# 「管理人のかに」は6文字なので文字が返ってくる
print(return_diff_values('管理人のかに'))
print(type(return_diff_values('管理人のかに')))
管理人のかに <class 'str'>
ひとこと
複雑な関数には型ヒントをつけよう・・・
でも記法に従っていると逆にごちゃごちゃすることもあるので,どこまでやるかは考えものですね・・・
-
以下のコマンドは
mypyコマンドを実行する場所がhoge.pyと同じ階層であることが前提です.hoge.pyが別の場所にある場合はそのpathを指定してください(例:mypy ./xxx/hoge.py) ↩