使用python获取该函数内的当前函数名
Posted
技术标签:
【中文标题】使用python获取该函数内的当前函数名【英文标题】:get current function name inside that function using python 【发布时间】:2016-01-14 17:23:55 【问题描述】:出于我的日志记录目的,我想记录我的代码所在的所有函数名称
不管是谁在调用这个函数,我想要我声明这一行的函数名
import inspect
def whoami():
return inspect.stack()[1][3]
def foo():
print(whoami())
目前它打印foo
,我想打印whoami
【问题讨论】:
你想调用并执行函数,还是只调用名称?因为你现在做的是后者,最后一行whoami
后面没有括号。
"当前它打印foo
":您当前的示例代码什么也不打印,或者至少它不会打印foo
。请编辑它并提供一个有效的例子。
inspect.stack()[0][3] ?
您可能打算这样做:print(whoami())
。此外,@hero 是正确的,您应该访问 inspect.stack()[0][3]
以获取名称
【参考方案1】:
你可能想要inspect.getframeinfo(frame).function
:
import inspect
def whoami():
frame = inspect.currentframe()
return inspect.getframeinfo(frame).function
def foo():
print(whoami())
foo()
打印
whoami
【讨论】:
这对我有用:return inspect.getouterframes(inspect.currentframe())[1].function
【参考方案2】:
出于我的日志记录目的,我想记录我的代码所在的所有函数名称
你考虑过装饰器吗?
import functools
def logme(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
print(f.__name__)
return f(*args, **kwargs)
return wrapped
@logme
def myfunction():
print("Doing some stuff")
【讨论】:
谢谢埃里克,我会试试的。有没有办法将该装饰器应用于类的所有功能 @JohnKaff:是的,您也可以将装饰器应用于类。你会希望装饰器遍历类对象的所有方法,并将它们包装在这个装饰器中。【参考方案3】:实际上,如果这是关于日志记录,Eric 的回答指出了方向:
出于我的日志记录目的,我想记录我的代码所在的所有函数名称
您可以调整格式化程序以记录function name:
import logging
def whoami():
logging.info("Now I'm there")
def foo():
logging.info("I'm here")
whoami()
logging.info("I'm back here again")
logging.basicConfig(
format="%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s",
level=logging.INFO)
foo()
打印
2015-10-16 16:29:34,227 [INFO] foo: I'm here
2015-10-16 16:29:34,227 [INFO] whoami: Now I'm there
2015-10-16 16:29:34,227 [INFO] foo: I'm back here again
【讨论】:
@JohnKaff:我认为您在这里遇到了 X/Y 问题的案例,并且可能应该问一个关于如何最好地记录函数调用(使用参数、类方法等)的新问题) 在 python 中 这比什么都好。【参考方案4】:调用sys._getframe()
以获取frame
类实例。 f_code.co_name
成员持有函数名。
sys._getframe(0).f_code.co_name
添加一个简单的辅助函数func_name()
来包装调用
import sys
def func_name():
return sys._getframe(1).f_code.co_name
def func1():
print(func_name())
func1() # prints 'func1'
【讨论】:
【参考方案5】:这个简单的可重用方法返回调用者/父函数的名称:
def current_method_name():
# [0] is this method's frame, [1] is the parent's frame - which we want
return inspect.stack()[1].function
例子:
def whoami():
print(current_method_name())
whoami()
-> 输出是 whoami
【讨论】:
以上是关于使用python获取该函数内的当前函数名的主要内容,如果未能解决你的问题,请参考以下文章