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

Dar*_*zer 41 python

我觉得我应该知道这一点,但我无法弄明白......

我想从内部获取方法的名称 - 恰好是集成测试 - 因此它可以打印出一些诊断文本.当然,我可以在字符串中对方法的名称进行硬编码,但如果可能的话,我想让测试更加干燥.

mha*_*wke 55

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

import inspect
def somefunc(a,b,c):
    print "My name is: %s" % inspect.stack()[0][3]
Run Code Online (Sandbox Code Playgroud)

您可以将此概括为:

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

def somefunc(a,b,c):
    print "My name is: %s" % funcname()
Run Code Online (Sandbox Code Playgroud)

感谢斯特凡Lippens这是通过谷歌找到.


spi*_*piv 23

涉及内省inspect等的答案是合理的.但根据您的具体情况,可能还有其他选择:

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


nos*_*klo 16

此装饰器通过将其作为关键字参数传递,使该方法的名称在函数内可用.

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
Run Code Online (Sandbox Code Playgroud)

你会这样使用它:

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

print sum(2, 4)
Run Code Online (Sandbox Code Playgroud)

但也许你想在装饰者本身内直接写出你想要的东西.然后代码是一个在装饰器中获取函数名的方法的示例.如果您提供有关您希望在函数中执行的操作的更多详细信息,这需要使用名称,也许我可以建议其他内容.

  • 使用装饰器依靠实现细节+1 (2认同)
  • @MatthewTrevor 说实话,我看到装饰器依赖于实现细节。根据http://stackoverflow.com/questions/251464/how-to-get-a-function-name-as-a-string-in-python,最好使用 `.__name__` 而不是 `.func_name` 。不过,我同意基本想法。 (2认同)

Kev*_*tle 10

# 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()
Run Code Online (Sandbox Code Playgroud)

输出:

$ python foo.py
Here in testit, file foo.py, line 17
WHERE says 'foo.py/18 testit()'
Run Code Online (Sandbox Code Playgroud)

使用"back = 1"查找关于堆栈等两个级别的信息等.