0
3

More than 3 years have passed since last update.

PEP-362 (Function Signature Object) を読んだよメモ

Posted at

__signature__ という属性がどこからやってきたのを理解するために PEP 362 -- Function Signature Object を読むことになったので、自分の理解をメモに残しておく。

概要

  • これまで関数シグネチャの表現は複雑な形式で表現されていた
  • PEP 362 では、関数シグネチャを表現する Signature というクラスを使って、関数シグネチャをシンプルに表現できるようにする
  • また、 inspect.signature() という関数を使って、かんたんに関数オブジェクトから関数シグネチャを取り出せるようにする

感想

あとは細かい使い方なので説明は省きます。PEP 362 を読んでもいいし、Python のドキュメントの inspect のページ を読んでもよいです。
かつて inspect.getargspec() やオブジェクトの属性を駆使して関数シグネチャを読み取っていた過去がありましたが、いまや inspect.signature() ひとつで大抵のことが事足りるようになりました。ビバ、Signature。

さて、最初の疑問であった __signature__ についてもこの PEP で言及されていました。Signature オブジェクトを func.__signature__ に保存しておくと inspect.signature() はその値を返してくれる、とのことです。つまりキャッシュみたいなものですね。

なお、PEP 362 では C拡張については対象外とされていましたが、Argument Clinic How-To を流し読みした限りでは、C ファイルのプリプロセッサである Argument Clinic を使って(従って)C拡張を作ると Signature に対応したモジュールが作れるようです。便利ですね。

なかなか関数シグネチャを必要とする場面は少ないのですが、引数や関数の型について調べたいに活躍するので試してみてはどうでしょうか。

0
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
0
3