如何从Python函数或方法中获取函数或方法的名称?

如何从Python函数或方法中获取函数或方法的名称?,python,Python,我觉得我应该知道这一点,但我还没有弄明白 我想从内部获取一个方法的名称——这恰好是一个集成测试——这样它就可以打印出一些诊断文本。当然,我可以在字符串中硬编码方法的名称,但如果可能的话,我想让测试更简单一些。我认为模块可能有您想要的。特别是,extract\u stack函数似乎可以完成这项工作。此修饰符通过将方法名作为关键字参数传递,使其在函数中可用 from functools import wraps def pass_func_name(func): "Name of decor

我觉得我应该知道这一点,但我还没有弄明白


我想从内部获取一个方法的名称——这恰好是一个集成测试——这样它就可以打印出一些诊断文本。当然,我可以在字符串中硬编码方法的名称,但如果可能的话,我想让测试更简单一些。

我认为模块可能有您想要的。特别是,
extract\u stack
函数似乎可以完成这项工作。

此修饰符通过将方法名作为关键字参数传递,使其在函数中可用

from functools import wraps
def pass_func_name(func):
    "Name of decorated function will be passed as keyword arg _func_name"
    @wraps(func)
    def _pass_name(*args, **kwds):
        kwds['_func_name'] = func.func_name
        return func(*args, **kwds)
    return _pass_name
您可以这样使用它:

@pass_func_name
def sum(a, b, _func_name):
    print "running function %s" % _func_name
    return a + b

print sum(2, 4)

但也许你想直接在装饰器内部写下你想要的东西。然后,代码是在装饰器中获取函数名的一个示例。如果您提供更多关于您想在函数中执行的操作的详细信息,这需要名称,也许我可以建议其他操作。

这似乎是使用模块
检查的最简单方法:

import inspect
def somefunc(a,b,c):
    print "My name is: %s" % inspect.stack()[0][3]
你可以概括为:

def funcname():
    return inspect.stack()[1][3]

def somefunc(a,b,c):
    print "My name is: %s" % funcname()
通过谷歌找到的信用卡

# file "foo.py" 
import sys
import os

def LINE( back = 0 ):
    return sys._getframe( back + 1 ).f_lineno
def FILE( back = 0 ):
    return sys._getframe( back + 1 ).f_code.co_filename
def FUNC( back = 0):
    return sys._getframe( back + 1 ).f_code.co_name
def WHERE( back = 0 ):
    frame = sys._getframe( back + 1 )
    return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ),     
                            frame.f_lineno, frame.f_code.co_name )

def testit():
   print "Here in %s, file %s, line %s" % ( FUNC(), FILE(), LINE() )
   print "WHERE says '%s'" % WHERE()

testit()
输出:

$ python foo.py
Here in testit, file foo.py, line 17
WHERE says 'foo.py/18 testit()'

使用“back=1”查找有关堆栈中两个级别的信息,等等。

通过
inspect
等进行内省的答案是合理的。但根据您的情况,可能还有另一种选择:


如果您的集成测试是用模块编写的,那么您可以在测试用例中使用
self.id()

+1关于使用装饰器而不是依赖于实现details@MatthewTrevor老实说,我看到一个依赖于实现细节的装饰者。根据这一点,最好使用
.func\u name
而不是
.func\u name
。不过,我同意这个基本想法。我刚刚发现self.id()在unittest setUp()方法中工作(它返回测试的名称,而不是“setUp”本身),这与其他解决方案不同。因此,我将此更改为这个特定问题的公认答案。可能是@DarenW的重复,但不是。从包含函数对象的变量请求函数名和从内部请求函数名是两个截然不同的问题。