2009-03-09 15 views
2

Bir dekoratörün kullanıldığı bazı yöntemlerin yürütülmesini izlemeyi denedim. Ben yöntemlere bu dekoratör uygulamak denersenizTüm parametreleri bir dekoratöre nasıl aktarabilirim?

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 

şey, kendinden parametre gönderilen almaz: İşte dekoratör kodudur. Bana nedenini söyleyebilir misin, bunu nasıl düzeltebilirim?

+1

Xargs noktası nedir = args? Doğrudan doğrudan% operatörüne geçirebilirsiniz. – Algorias

cevap

6

Bu çizgi yanlıştır: Sen bunu geçen yaparken argüman listesini genişletmek için unutuyorsun

ret_val = func(args) 

. Olmalıdır: etapta bu değişiklik ile

ret_val = func(*args) 

Örnek çıktı: Hiç de anahtar kelime argümanları almak için dekoratör genişletirseniz onları geçerken

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

, ayrıca uygun olanlar genişletmek gerekiyordu ** kullanarak.

+0

Her iki argüman listesi de fonksiyonların/yöntemlerin anahtar kelime argümanlarıyla işlenmesi için '(* args, ** kwargs)' yazmalıdır. – Ber

İlgili konular