打日志的时候,经常会需要遇到打印当前函数名,以及执行他的函数名称。如果打印的函数名称正确的话,查询定位问题的原因效率就会提升,如果没有,查找代码就会麻烦的很。
这里介绍几个方法: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了,可以明晰的打印出那个函数的名称