python筆記_查看函數調用棧的一個小技巧


一、背景

最近在看一個開源框架的源碼,涉及到的內容非常雜亂,有的函數不知道是在什么時候被誰給調用了?調用的時候傳入了什么參數?為了解決這個問題,寫了一個小的裝飾器。

二、實現

這個裝飾器函數主要參考了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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM