0

デコレータ内で、装飾されているオブジェクトの名前を参照できますか?例えば、

def add_debug_info(func):
    # how to write magic_function?
    name = magic_function(func)
    # name is 'execute' when applied as
    # @add_debug_info
    # def execute():

より高いレベルの関数を渡しているため、この名前を含むデバッグステートメントを出力しようとしています。デバッグステートメントがどの関数を参照しているかを判断するのは困難です。

オブジェクトの名前を取得する方法は1つしかわかりませんが、ここではうまく機能しません(複数の名前でオブジェクトを参照できますが、たまたま装飾された1つの特定の名前が必要です)。

4

1 に答える 1

3

.__name__関数の元の名前は属性に格納されます。

>>> def foo(): pass
...
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'

このような興味深い情報はデータモデルのドキュメントで見つけることができ、その情報の多くはinspectモジュールのドキュメントにもまとめられています。

また、名前やドキュメント文字列など、元のラップされた関数の属性を使用してラッパー関数 (デコレータでよく使用される) を更新するfunctools.wrapsdecoratorを確認することもできます。

于 2013-01-16T21:26:28.173 に答える