■ はじめに
今更なのだが、Pythonで データ型を指定して 書くことを改めて、ちゃんと調べてみたので、メモ。 はじめ、軽ーく書くつもりだったのだが、 調べていくうちに思いのほか長くなってしまった、、、
目次
【1】関連用語 1)関数アノテーション(Function Annotations) 2)型ヒント(Type Hints) 【2】使用上の注意 1)強制力はない 2)Pythonバージョンによって書き方が異なる 【3】利点 【4】構文 1)代表的なデータ型 2)Typingモジュールによる型指定 【5】サンプル 例1:基本的な関数アノテーション 例2:Typingモジュール
【1】関連用語
1)関数アノテーション(Function Annotations)
* 関数の引数や戻り値に、注釈/注記(アノテーション)を記述できる * Python 3.0から。
2)型ヒント(Type Hints)
* 関数アノテーションに型情報を記述すること(型ヒント)が PEP484で規定された (PEP3107の関数アノテーションでは、アノテーションに何を書くかは、 定義されていなかった) * 暫定的に標準ライブラリにTypingモジュールが追加 * Python v3.5 から。
https://docs.python.org/ja/3/library/typing.html
【2】使用上の注意
1)強制力はない
https://docs.python.org/ja/3/library/typing.html
に書かれている通り、 「Python ランタイムは、関数や変数の型アノテーションを強制しません」 つまり、JavaやC#のようなコンパイラ言語とは異なり、 従わなくてもエラーにならない(型チェックはしない)
2)Pythonバージョンによって書き方が異なる
まだ発展途上なのかPythonのバージョンによって 文法が異なるので、自分が使用する環境を把握した上で コーディングする必要がある => 個人的な意見としては、最新バージョンのPythonに合わせるより 多少古いバージョンで書いた方が後々問題は起きないのかと、、、 (Linuxサーバ上で動かすならそのサーバにデフォルトで入っている Pythonバージョンを基準にするなど) => 以下の例だけでなく、以下のサイトによれば、 Python3.9でも書き方があるみたい。
https://future-architect.github.io/articles/20201223/
Python3.5~3.9での書き方
from typing import Union # num は 「int」or「float」両方指定可能 num: Union[int, float] = 1.0
Python3.10での書き方
https://atmarkit.itmedia.co.jp/ait/articles/2110/15/news034.html
# 書き方が簡単になったが、 # 当たり前だが Python3.9以下では使用できない num: int | float = 1.0
【3】利点
「【2】使用上の注意」で書いた通り、強制力はないのに じゃー何で書く必要があるか。
データ型を指定する利点
[1] 可読性が上がる [2] サードパーティーツール で、補完機能や静的型チェックをしてくれる
補足:VS Codeの場合
https://docs.python.org/ja/3/library/typing.html
より抜粋。 ~~~~~ 型アノテーションは、型チェッカー、IDE、linterなどの サードパーティーツールで使われます ~~~~~ VS Codeの場合、 以下の関連記事で紹介した「Pylance」や「mypy」など の拡張機能を使えば、恩恵が得られる。
https://dk521123.hatenablog.com/entry/2021/11/08/221219
【4】構文
# 引数は、引数の後に、コロン:を付けてデータ型を指定 # 戻り値は、引数の閉じカッコの後に、矢印->を付けてデータ型を指定 def 関数名(引数名 : 型,....) -> <戻り値の型>: return ...
1)代表的なデータ型
組み込み型 | 説明 |
---|---|
str | 文字列 |
bool | 真偽値 |
int | 整数 |
float | 浮動小数点数 |
list | リスト |
tuple | タプル |
set | 集合型 |
dict | 辞書型(キー・バリュー型) |
bytes | バイトオブジェクト |
bytearray | 可変バイトオブジェクト |
2)Typingモジュールによる型指定
型 | 説明 | 例 |
---|---|---|
List[X] | 要素の型がXのリスト | name_list: List[str] |
Union[X, Y] | XかYのいずれかの型 | number:Union[int, float] |
Any | 任意の型 | object_data:Any |
Callable[[X . . . .], Y] | 引数に指定する型のリストが[X …. ] で戻り値がY | value:Callable[[int, float], str] |
Dict[X, Y] | 辞書でキーの型がX, 値がY | name_dict:Dict[int, str] |
【5】サンプル
例1:基本的な関数アノテーション
def sum(a: float, b: float) -> float: return a + b # 返り値がない場合は-> None or typing.NoReturn をつける def say_hello() -> None: print("Hello world!")
例2:Typingモジュール
from typing import Any def just_return(input: Any) -> Any: return input
参考文献
https://note.nkmk.me/python-function-annotations-typing/
https://deecode.net/?p=530
https://future-architect.github.io/articles/20201223/
https://gammasoft.jp/blog/python3-function-annotations/
https://techacademy.jp/magazine/38219
https://lab.astamuse.co.jp/entry/2019/09/18/115033
関連記事
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / Enum ~
https://dk521123.hatenablog.com/entry/2019/11/26/234736
Python ~ 基本編 / リスト・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/01/000000
Python ~ 基本編 / 例外処理 ~
https://dk521123.hatenablog.com/entry/2019/08/03/000000
Python を奇麗に書くためのツール群
https://dk521123.hatenablog.com/entry/2021/11/08/221219