有没有办法让以下代码:
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'之外的任何其他内容 到“日志”功能。
答案 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()