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