一、背景
最近在看一個開源框架的源碼,涉及到的內容非常雜亂,有的函數不知道是在什么時候被誰給調用了?調用的時候傳入了什么參數?為了解決這個問題,寫了一個小的裝飾器。
二、實現
這個裝飾器函數主要參考了logging模塊中的findCaller,源碼如下:
1 def findcaller(func): 2 def wrapper(*args,**kwargs): 3 import sys 4 f=sys._getframe() 5 filename=f.f_back.f_code.co_filename 6 lineno=f.f_back.f_lineno 7 print '######################################' 8 print 'caller filename is ',filename 9 print 'caller lineno is',lineno 10 print 'the passed args is',args,kwargs 11 print '######################################' 12 func(*args,**kwargs) 13 return wrapper
只要加上這個裝飾器,就能在調用函數前看到這個函數被哪個文件中的第幾行調用,並且傳入的參數是什么。例子如下:
1 #caller.py 2 from class_A import A 3 a1=A() 4 a2=A(1) 5 a3=A(2) 6 a2.func(3) 7 8 #class_A.py 9 class A(object): 10 def __init__(self,num=0): 11 print num 12 @findcaller 13 def func(self,num=None): 14 print num 15 16 #執行caller,得到結果如下: 17 ###################################### 18 caller filename is caller.py 19 caller lineno is 5 20 the passed args is (<class_A.A object at 0xb7200a4c>, 3) {} 21 ######################################
可以看到是caller.py中的第5行a2.func(3)調用到了func函數,傳入參數是3.