【Python】関数の戻り値が複数ある場合の型ヒントの書き方

本記事は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]としています.
(関数の実行によって戻ってくる値はstrintという表現です)

参考

以下は上記の関数の実行例です.


# 「管理人」は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'>

ひとこと

複雑な関数には型ヒントをつけよう・・・
でも記法に従っていると逆にごちゃごちゃすることもあるので,どこまでやるかは考えものですね・・・


  1. 以下のコマンドはmypyコマンドを実行する場所がhoge.pyと同じ階層であることが前提です.hoge.pyが別の場所にある場合はそのpathを指定してください(例:mypy ./xxx/hoge.py)