TypeAliasにより明示的な型エイリアスの指定が可能に
型エイリアスとは、その名の通り型に別名を付ける機能です。型エイリアスを明示的な構文で定義することで、型チェックの正確さを向上させます。
型エイリアスとは?
例えば、文字列を表すstrにもっと意味のある型名を付与したい場合があります。商品名を表すProductName型を使いたい、けど実体はstr型でいいというようなケースです。このとき、以下のようにグローバルにProductName型をstr型の型エイリアスとして宣言します。
# str型の別名にProductNameを定義 ProductName = str # ProductNameは型ヒントに使える def check_product(name: ProductName) -> ProductName: return name
これで、str型の別名としてのProductName型が利用できるようになります。関数check_productは、ProductName型の引数を受け取り、同じくProductName型の戻り値を返します。しかしながら、型エイリアスの定義から分かるように、見た目は代入と同じであるので非常に紛らわしいです。また、静的型チェックツールで誤りを検出しにくくなるという問題も発生します。例えば以下のリストです。
…略… # UserFuncは関数オブジェクトになってしまう UserFunc = check_product (1) # ここでチェックエラー:関数オブジェクトは型ヒントに使えない f: UserFunc = None (2)
見た目に問題はないように見えますが、check_productは関数オブジェクトであり、UserFuncは型エイリアスではなく関数オブジェクトとなります。そのため、(2)で構文エラーとなります。本来であれば、(1)で型チェックツールに指摘してほしいのですが、実際には(2)でエラーになり、少々分かりにくいということになります。
TypeAliasの追加
このため、Python 3.10では型エイリアスであることを明示するTypeAliasがtypingモジュールに追加されました。上記のコードは、以下のように書き直すことができます。これにて、(1)の箇所で静的型チェックツールがエラーを指摘するようになります。
from typing import TypeAlias …略… # ここでチェックエラー:check_productは有効な型ではない UserFunc: TypeAlias = check_product (1) # 無意味な宣言 f: UserFunc = None