2009-03-09 6 views
2

私はデコレータを使っていくつかのメソッドの実行をトレースしようとしました。デコレータコードを以下に示します:すべてのパラメータをデコレータに渡すにはどうすればよいですか?

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パラメータは送信されません。どうして私にそのことを教えてもらえますか?どうすれば修正できますか?

+1

xargs = argsのポイントは何ですか? argを直接%演算子に渡すことができます。 – Algorias

答えて

6

この行が正しくありません:あなたは、あなたがそれを渡している時に引数リストを展開するために忘れている

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

あなたは今までもキーワード引数を取るためにあなたのデコレータを展開する場合は、適切にそれらを展開する必要があるだろうオン、**を使用します。

+0

両方の引数リストは、キーワード引数を持つ関数/メソッドも処理するために '(* args、** kwargs)'を読み込む必要があります。 – Ber

関連する問題