一、背景
最近在看一个开源框架的源码,涉及到的内容非常杂乱,有的函数不知道是在什么时候被谁给调用了?调用的时候传入了什么参数?为了解决这个问题,写了一个小的装饰器。
二、实现
这个装饰器函数主要参考了logging模块中的findCaller,源码如下:
1 deffindcaller(func):2 def wrapper(*args,**kwargs):3 importsys4 f=sys._getframe()5 filename=f.f_back.f_code.co_filename6 lineno=f.f_back.f_lineno7 print '######################################'
8 print 'caller filename is',filename9 print 'caller lineno is',lineno10 print 'the passed args is',args,kwargs11 print '######################################'
12 func(*args,**kwargs)13 return wrapper
只要加上这个装饰器,就能在调用函数前看到这个函数被哪个文件中的第几行调用,并且传入的参数是什么。例子如下:
1 #caller.py
2 from class_A importA3 a1=A()4 a2=A(1)5 a3=A(2)6 a2.func(3)7
8 #class_A.py
9 classA(object):10 def __init__(self,num=0):11 printnum12 @findcaller13 def func(self,num=None):14 printnum15
16 #执行caller,得到结果如下:
17 ######################################
18 caller filename iscaller.py19 caller lineno is 5
20 the passed args is (, 3) {}21 ######################################
可以看到是caller.py中的第5行a2.func(3)调用到了func函数,传入参数是3.