__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 に対応したモジュールが作れるようです。便利ですね。
なかなか関数シグネチャを必要とする場面は少ないのですが、引数や関数の型について調べたいに活躍するので試してみてはどうでしょうか。