ある議論の流れで PEP-593 (Flexible function and variable annotations) を読むことになったので、自分の理解をメモに残しておく。
概要
- PEP-3107 (Function Annotations) は Python の文法にアノテーションを導入した。その際、アノテーションの用途として型ヒントや DB クエリーのマッピング、RPS のマーシャリング情報などを挙げていた。
- PEP-484 (Type Hints) はアノテーション記法を使って型ヒントを実現する方法を導入した。いまやアノテーションの主たる利用方法であると言える。
- PEP-484 がデファクトスタンダードとなった今、型ヒント以外の用途にアノテーションを使いづらくなってしまった。
- そこで、アノテーションを再定義して型ヒントに加えて、さらに独自のメタデータも記述できるようにするよ。
アプローチ
- 新たに
typing.Annotated
を追加する - あるデータや関数に型 T とメタデータ x, y をアノテーションするときには
Annotated[T, x, y]
と書く- 先頭の要素は型とみなされる
- 型チェッカーは
T
を、メタデータを利用するツールやライブラリはx
やy
をそれぞれ参照すればよい- つまり、ツールやライブラリはサポートしていないアノテーションを無視してくれる
例
数値で、3-10 の範囲の値で、ctype では文字とみなされるような(架空の)アノテーション。
Annotated[int, ValueRange(3, 10), ctype("char")]
感想
-
Annotated
って書きづらい。もっとラフに tuple で書きたかった… - 実行時でもアノテーションの内容を取得できる(
get_type_hints()
)ので、これを使うライブラリやフレームワークが出てきそうな予感 - 乱用された結果、カオスなコードにならないことを祈りたい
- PEP-3107 (関数アノテーション)は紹介されているのに PEP-526 (Syntax for Variable Annotations; 変数アノテーション) には一切言及がない。不憫な子…
- もちろん関数だけでなく変数にもアノテーションできます。
- Sphinx でも対応しなくちゃ…
- 引数や変数の説明をアノテーションできそうだけど、どう考えても書くのがだるいので流行らない気がする
- イシュー作っておいた。きっと明日の自分がやってくれる…。
def hello(name: Annotated[str, Description("名前")],
message: Annotated[str, Description("メッセージフォーマット")],
language: Annotated[str, Description("言語")] = "ja"
) -> Annotated[None, Description("なし")]:
...