打日志的时候,经常会需要遇到打印当前函数名,以及执行他的函数名称。如果打印的函数名称正确的话,查询定位问题的原因效率就会提升,如果没有,查找代码就会麻烦的很。
这里介绍几个方法:sys模块,inspect模块
1、获取函数名称,获取类名称。
## 获取函数名称
deftest_func():pass
print('函数名称为:',test_func.__name__)##获取类名称
classTest:deftest(self):print(self.__class__.__name__)print('类名称为:',Test().__class__.__name__)
t= Test().test()
结果为:
函数名称为: test_func
类名称为: Test
Test
2、在函数内部或者类内部获取函数名称,可以使用sys模块中的sys._getframe().f_code.co_name,如下例:
importsys## 函数获取函数名称
deftest_sys():print('当前函数名称:',sys._getframe().f_code.co_name)
test_sys()##类获取函数名称
classTestSys:defts(self):print('当前函数名称:', sys._getframe().f_code.co_name)
t=TestSys()
t.ts()
结果:
当前函数名称: test_sys
当前函数名称: ts
当然,一般常用的是在不同的函数里调用的他,想要打印调用他的函数,我们尝试一下
importsys## 函数获取函数名称
defa():print('当前函数名称:',sys._getframe().f_code.co_name)defuse_a():## 使用a函数
a()## 调用使用a函数
print('------函数调用------')
use_a()##类获取函数名称
classTestSys:deftesta(self):print('当前函数名称:', sys._getframe().f_code.co_name)deftestb(self):
self.testa()## 一个类时
print('------单个类时内部调用------')
t=TestSys()
t.testb()classTestsys:deftestc(self):
TestSys().testa()## 两个类时,第二个类调用第一个类
print('------多个类时内部调用------')
t=Testsys()
t.testc()
结果为:
------函数调用------当前函数名称: a------单个类时内部调用------当前函数名称: testa------多个类时内部调用------当前函数名称: testa
由上可见,sys.__getframe().f_code.co_name是只能打印自己所在函数的名称,无法打印调用他的函数名称
3、使用inspect模块中的inspect.stack()方法,动态获取当前运行的函数名(或方法名称),我们看一个例子
importinspect## 函数获取函数名称
defa():print('当前函数名称:',inspect.stack()[1][3])defuse_a():## 使用a函数
a()## 调用使用a函数
print('------函数调用------')
use_a()##类获取函数名称
classTestSys:deftesta(self):print('当前函数名称:', inspect.stack()[1][3])deftestb(self):
self.testa()## 一个类时
print('------单个类时内部调用------')
t=TestSys()
t.testb()classTestsys:deftestc(self):
TestSys().testa()## 两个类时,第二个类调用第一个类
print('------多个类时内部调用------')
t=Testsys()
t.testc()
结果为:
------函数调用------当前函数名称: use_a------单个类时内部调用------当前函数名称: testb------多个类时内部调用------当前函数名称: testc
由上可见,inspect.stack()打印的是调用他的函数
有了这几种方法的支持,可以随心所欲的打log了,可以明晰的打印出那个函数的名称