【Python】Python ~ 基本編 / 型指定・Typing ~

■ はじめに

 今更なのだが、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