1
3

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 560 (Core support for typing module and generic types) を読んだよメモ

Last updated at Posted at 2020-04-12

昨日に引き続いて __origin__ という属性について調べていたら、PEP 560 -- Core support for typing module and generic types という PEP にたどり着きました。この PEP は 3.7 から採用されているので、すでに実装が存在して触ることができるやつです。

概要

  • 型ヒントが登場したとき、Python 本体に手を入れないように設計していた
  • しかし、当時(バージョン 3.6)は 3つの問題があった
    • typing モジュールのパフォーマンス
    • メタクラスの競合
    • typing モジュールで使われている多数のハック

アプローチ

  • __class_getitem____mro_entries__ というふたつのスペシャルメソッドを追加する
  • __class_getitem__
    • クラスオブジェクト向けの __getitem__
    • Iterable[int] などの場面で利用される
  • __mro_entries__
    • クラスではないオブジェクトから派生クラスを作るときに呼び出される
    • __mro_entries__ が返したクラスをもとに派生クラスの MRO を決定する
    • typing._GenericAlias を実現するための仕掛け
      • List[int]__mro_entries__list を返すので、実行時は list のサブクラスとして振る舞う
    • クラス定義時の継承クラスは __orig_base__ に、解決済みの継承クラスは __base__ に保存される

感想

  • typing._GenericAlias が生まれましたきっかけとなる PEP を読みました
  • この PEP を読んでから typing モジュールを読むとわかりやすいです
  • PEP をあさり始めた目的であった __origin__ は、 __mro_entries__ を実現するためのプライベートな属性だったというオチでした
  • __class_getitem__ もうまく使うとハックしがいがありそうですね
1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?