美文网首页Django源码分析程序员生活不易 我用python
python笔记_查看函数调用栈的一个小技巧

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

作者: Stansosleepy | 来源:发表于2016-01-06 20:26 被阅读1754次

一、背景

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

二、实现

这个装饰器函数主要参考了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.

相关文章

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

    一、背景 最近在看一个开源框架的源码,涉及到的内容非常杂乱,有的函数不知道是在什么时候被谁给调用了?调用的时候传入...

  • python学习4

    学廖雪峰老师的python教程笔记。 1、递归函数 函数内部调用该函数本身,比循环逻辑简单 注意防止栈溢出 尾递归...

  • Python小技巧和有趣的内置函数

    Python小技巧和有趣的内置函数 一个python小技巧的集合和一些很有用的Python内置函数,这些函数简直是...

  • 使用gdb查看Python print函数的调用栈

    由于项目的原因我想看看Python中print一类的函数的执行过程,试过单步调试的方法,但太过繁琐,因为对源码不熟...

  • [转载]C语言函数调用栈

    原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...

  • 【Python】语法学习4

    一、 函数 1.从Python中调用函数 从Python的官方网站查看文档:(abs)http://docs.py...

  • 巧用函数栈实现栈的反转

    一、函数栈 函数的调用过程其实就是一个压栈的过程,在函数栈中,每个函数所占空间成为一个 栈帧。栈帧中保存着函数的形...

  • Python学习笔记06 调用和定义函数

    关于函数 Python内置了很多函数。 要调用函数,需要知道函数的名称和参数。 可以通过help(函数名)查看函数...

  • 函数调用栈平衡

    栈平衡 栈平衡:函数调用前后的栈顶指针指向的位置不变 内平栈 外平栈 内平栈: 指的是在函数调用返回之前使栈保持...

  • 宏、普通函数、内联函数之间的区别

    普通函数 调用时向栈中push函数帧,调用结束后pop函数帧。编译器会在函数调用语句的前后,插入入栈和出栈的辅助代...

网友评论

本文标题:python笔记_查看函数调用栈的一个小技巧

本文链接:https://www.haomeiwen.com/subject/ngaxkttx.html