python3.3から入った__qualname__を使ってみる(前回の続き)
今回も前回のネタを引っ張ります。
前回のvalidate_methodデコレータの問題点として継承して定義したクラスに使用すると継承元のメソッドまでチェックしてしまいうまく動きません。
標準モジュールのクラスやサードパーティ製モジュールのクラスを継承することは良くあるはずなので問題があります。
という訳でうまいこと回避したいんですけど参照しているメソッドがどのクラスで定義されてるかを取得する方法がわかりません。
良い方法が見つからなかったんですけどpython3.3から入った__qualname__という変数を使えばなんとかなりそうです。
(PEP3155を見る限りでは使い方としてはそんなに間違ってない気がします。)
http://docs.python.org/3.3/glossary.html#term-qualified-name
split(".")して取得したクラス名と判定したいメソッドのクラス名を比較すれば自分のクラスで定義したメソッドかどうか判定できるはずです。
for name, func in getmembers(cls, isfunction): clsname = func.__qualname__.split(".")[-2] if cls.__name__ != clsname: continue
こんな感じですっ飛ばしました。
しかし、う〜ん、もっとスマートな方法がありそうな気がするんですけど・・・
良い方法知ってる方いたら教えて下さい。m(._.)m