Python:如何获取我所在函数的* full *名称

时间:2017-08-02 20:25:08

标签: python traceback inspect

有没有办法让以下代码:

import traceback

def log(message):
    print "%s: %s" %(traceback.extract_stack()[0:-1][-1][2], message)

def f1():
    log("hello")

class cls(object):
    def f1(self):
        log("hi there")

f1()
mycls = cls()
mycls.f1()

显示:

f1: hello
cls.f1: hi there

而不是:

f1: hello
f1: hi there

我尝试使用模块'inspect',但没有成功......

于连

  

编辑:

     

这里的重点是'log'功能能够检索其调用者   名称本身(使用追溯,检查或任何必要的手段)。

     

我不想传递类名,或者除了'message'之外的任何其他内容   到“日志”功能。

2 个答案:

答案 0 :(得分:0)

所以我终于提出了这个方法:

#!/usr/bin/env python3

def log(message):
    import inspect
    import gc
    code = inspect.currentframe().f_back.f_code
    func = [obj for  obj in  gc.get_referrers(code) if inspect.isfunction(obj)][0]
    print(func.__qualname__, message)

它需要python3才能使用__qualname__。

答案 1 :(得分:-1)

inspect模块功能非常强大,可以类似于使用traceback获取函数名称的方式使用,也可能使用类名。但是你可以简单地利用你拥有self实例变量的事实,该变量知道它自己的类型/类:

import inspect

class cls(object):
    def f1(self):
        this_class_name = type(self).__name__
        this_func_name = inspect.currentframe().f_code.co_name
        print(this_class_name, this_func_name)

mycls = cls()
mycls.f1()