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 

건은, 자기 매개 변수가 전송되지 않습니다 다음은 장식 코드입니다. 왜 그런지 말할 수 있습니까? 어떻게 해결할 수 있습니까?

+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

관련 문제