python笔记_查看函数调用栈的一个小技巧

一、背景

最近在看一个开源框架的源码,涉及到的内容非常杂乱,有的函数不知道是在什么时候被谁给调用了?调用的时候传入了什么参数?为了解决这个问题,写了一个小的装饰器。

二、实现

这个装饰器函数主要参考了logging模块中的findCaller,源码如下:

def findcaller(func):
    def wrapper(*args,**kwargs):
        import sys
        f=sys._getframe()
        filename=f.f_back.f_code.co_filename
        lineno=f.f_back.f_lineno
        print '######################################'
        print 'caller filename is ',filename
        print 'caller lineno is',lineno
        print 'the passed args is',args,kwargs
        print '######################################'
        func(*args,**kwargs)
    return wrapper

只要加上这个装饰器,就能在调用函数前看到这个函数被哪个文件中的第几行调用,并且传入的参数是什么。例子如下:

#caller.py
from class_A import A
a1=A()
a2=A(1)
a3=A(2)
a2.func(3)

#class_A.py
class A(object):
    def __init__(self,num=0):
        print num
    @findcaller
    def func(self,num=None):
        print num

#执行caller,得到结果如下:
######################################
caller filename is  caller.py
caller lineno is 5
the passed args is (<class_A.A object at 0xb7200a4c>, 3) {}
######################################

可以看到是caller.py中的第5行a2.func(3)调用到了func函数,传入参数是3.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,704评论 1 19
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,568评论 0 6
  • 装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返...
    时间之友阅读 2,307评论 0 3
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 5,530评论 6 53
  • 因为一首歌,喜欢一个人;因为一个人,喜欢一座城;因为一座城,喜欢上一种生活~
    吃枣药丸的汤圆阅读 345评论 0 1