すべてのパラメータをデコレータに渡すにはどうすればよいですか?
質問
デコレータを使用していくつかのメソッドの実行をトレースしようとしました。デコレータコードは次のとおりです。
def trace(func):
def ofunc(*args):
func_name = func.__name__
xargs = args
print "entering %s with args %s" % (func_name,xargs)
ret_val = func(args)
print "return value %s" % ret_val
print "exiting %s" % (func_name)
return ofunc
問題は、このデコレーターをメソッドに適用しようとしても、selfパラメーターが送信されないことです。理由とその修正方法を教えてください。
解決
この行は間違っています:
ret_val = func(args)
引数リストを渡すときに、引数リストを展開するのを忘れています。次のようになります。
ret_val = func(*args)
この修正を適用したサンプル出力:
>>> class Test2:
... @trace
... def test3(self, a, b):
... pass
...
>>> t = Test2()
>>> t.test3(1,2)
entering test3 with args (<__main__.Test2 instance at 0x7ff2b42c>, 1, 2)
return value None
exiting test3
>>>
デコレータを拡張してキーワード引数も使用する場合、 **
を使用して渡すときに適切に拡張する必要があります。
所属していません StackOverflow