最近 python/peps をフォローして PEP の更新を追いかけるようにしているのだが、GvR が PEP 613 (Explicit Type Aliases) は (3.9 ではなく) 3.10 に入れよう的なことを言っていたのでちょっと読んでみた。
I think it’s too late to add to 3.9, but it can be added to typing_extensions, and of course 3.10 is open (the master branch is now 3.10).
https://github.com/python/peps/issues/1412#issuecomment-633641359
概要
-
PEP-484 (Type Hints) では型エイリアスの存在については言及しているが、どう定義するのかを詳しく決めていなかった
- 今のところ グローバル変数 でなおかつ 型ヒントの付いていない変数 を型エイリアスとみなしている
- Forward Reference 問題やスコープなどで問題が起きがち
- そこで明示的に型エイリアスを定義できるようにするよ
- これまで通り暗黙的な型エイリアスの定義もしてもいいよ
- ステータスは Accepted なのでいずれ実装される (たぶん 3.10)
アプローチ
- 新たに
typing.TypeAlias
を追加する - 型エイリアスを定義するときは
T: TypeAlias = int
のように型エイリアス型の変数を記述する - グローバルレベルで定義された変数を型エイリアスとみなす
- ForwardReference するときは
T: TypeAlias = "int"
と書いてもよい
例
明示的な文法では以下のように扱われる。
# 単なるグローバル変数
x = 1
x: int = 1
# 単なるグローバル変数
x = int
x: Type[int] = int
# 型エイリアス
x: TypeAlias = int
x: TypeAlias = “MyClass”
感想
- Forward Refernece を考えると単なる文字列文字列定数も 型を指している可能性がある と扱う必要があったのが、explicit syntax だとセマンティックに書けるようになった
- とはいえ、これまでの implicit syntax がなくなるわけではないので、なにかが変わるわけでもない
- 利用する側としてはとりあえず
TypeAlias
型を付けておけば安心- なのだけど、その実装は(はやくても) 3.10 からなので使えるのは来年秋以降ですよ…
- 理由もわかるし、反対する理由もないのだけど、出るのがおそすぎて使われない予感しかしない
- 動作確認してないけど pyre ではすでに実装されてるっぽい?