8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PEP-593 (Flexible function and variable annotations) を読んだよメモ

Last updated at Posted at 2020-02-16

ある議論の流れで 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 を、メタデータを利用するツールやライブラリは xy をそれぞれ参照すればよい
    • つまり、ツールやライブラリはサポートしていないアノテーションを無視してくれる

数値で、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("なし")]:
    ...
8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?