使用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获取该函数内的当前函数名的主要内容,如果未能解决你的问题,请参考以下文章

数组函数

Python如何获取到当前函数名和通过字符串调用函数

在严格模式下获取当前函数名

好好学python·函数

python获取函数名

VIM:如何获取当前函数名