zoukankan      html  css  js  c++  java
  • python随记之获取当前函数名

    打日志的时候,经常会需要遇到打印当前函数名,以及执行他的函数名称。如果打印的函数名称正确的话,查询定位问题的原因效率就会提升,如果没有,查找代码就会麻烦的很。

    这里介绍几个方法:sys模块,inspect模块

    1、获取函数名称,获取类名称。

    ## 获取函数名称
    def test_func():
        pass
    
    print('函数名称为:',test_func.__name__)
    
    ##获取类名称
    class Test:
        def test(self):
            print(self.__class__.__name__)
    
    print('类名称为:',Test().__class__.__name__)
    
    t = Test().test()

    结果为:

    函数名称为: test_func
    类名称为: Test
    Test
    

    2、在函数内部或者类内部获取函数名称,可以使用sys模块中的sys._getframe().f_code.co_name,如下例:

    import sys
    ## 函数获取函数名称
    def test_sys():
        print('当前函数名称:',sys._getframe().f_code.co_name)
    
    test_sys()
    
    ##类获取函数名称
    class TestSys:
        def ts(self):
            print('当前函数名称:', sys._getframe().f_code.co_name)
    
    t = TestSys()
    t.ts()

    结果:

    当前函数名称: test_sys
    当前函数名称: ts

    当然,一般常用的是在不同的函数里调用的他,想要打印调用他的函数,我们尝试一下

    import sys
    ## 函数获取函数名称
    def a():
        print('当前函数名称:',sys._getframe().f_code.co_name)
    
    def use_a():
        ## 使用a函数
        a()
    
    ## 调用使用a函数
    print('------函数调用------')
    use_a()
    
    ##类获取函数名称
    class TestSys:
        def testa(self):
            print('当前函数名称:', sys._getframe().f_code.co_name)
    
        def testb(self):
            self.testa()
    ## 一个类时
    print('------单个类时内部调用------')
    t = TestSys()
    t.testb()
    
    
    class Testsys:
        def testc(self):
            TestSys().testa()
    
    ## 两个类时,第二个类调用第一个类
    print('------多个类时内部调用------')
    t = Testsys()
    t.testc()

    结果为:

    ------函数调用------
    当前函数名称: a
    ------单个类时内部调用------
    当前函数名称: testa
    ------多个类时内部调用------
    当前函数名称: testa

    由上可见,sys.__getframe().f_code.co_name是只能打印自己所在函数的名称,无法打印调用他的函数名称

    3、使用inspect模块中的inspect.stack()方法,动态获取当前运行的函数名(或方法名称),我们看一个例子

    import inspect
    ## 函数获取函数名称
    def a():
        print('当前函数名称:',inspect.stack()[1][3])def use_a():
        ## 使用a函数
        a()
    
    ## 调用使用a函数
    print('------函数调用------')
    use_a()
    
    ##类获取函数名称
    class TestSys:
        def testa(self):
            print('当前函数名称:', inspect.stack()[1][3])
    
        def testb(self):
            self.testa()
    ## 一个类时
    print('------单个类时内部调用------')
    t = TestSys()
    t.testb()
    
    
    class Testsys:
        def testc(self):
            TestSys().testa()
    
    ## 两个类时,第二个类调用第一个类
    print('------多个类时内部调用------')
    t = Testsys()
    t.testc()

    结果为:

    ------函数调用------
    当前函数名称: use_a
    ------单个类时内部调用------
    当前函数名称: testb
    ------多个类时内部调用------
    当前函数名称: testc

    由上可见,inspect.stack()打印的是调用他的函数

    有了这几种方法的支持,可以随心所欲的打log了,可以明晰的打印出那个函数的名称

  • 相关阅读:
    物联网操作系统HelloX开发者入门指南
    【 D3.js 高级系列 】 总结
    【 D3.js 高级系列 — 10.0 】 思维导图
    android fragment+ FragmentTabHost+viewpager 切换状态不保存的问题
    OpenGL 顶点缓存对象
    OpenGL顶点数组
    【 D3.js 高级系列 — 9.0 】 交互式提示框
    如何在 Linux 上录制你的终端操作
    程序员诗词大赛开始了_你看过吗?
    程序员与代码的搞笑日常
  • 原文地址:https://www.cnblogs.com/dflblog/p/11399573.html
Copyright © 2011-2022 走看看