• 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.

  • 相关阅读:
    JMX堆栈分析
    Python装饰器示例
    安装指定版本capistrano
    Linux CPU使用率含义及原理
    API gateway 之 kong 安装
    Redis内存分析方法
    Elasticsearch集群内的原理
    Elasticsearch基础
    Python智能检测编码并转码
    (转)rabbitmq的web管理界面无法使用guest用户登录
  • 原文地址:https://www.cnblogs.com/MrFiona/p/7007632.html
Copyright © 2020-2023  润新知