python現在の関数名の取得

2552 ワード

ログを打つとき、現在の関数名を印刷したり、関数名を実行したりすることがよくあります.印刷された関数名が正しいと、クエリーの位置決め問題の原因効率が向上し、なければコードの検索が面倒になります.
ここでは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
上から見えるstack()は彼を呼び出す関数を印刷します
このいくつかの方法のサポートがあって、好きなようにロゴを打つことができて、その関数の名前をはっきり印刷することができます