如何从 Python 函数或方法中获取函数或方法的名称?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/245304/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I get the name of a function or method from within a Python function or method?
提问by Daryl Spitzer
I feel like I should know this, but I haven't been able to figure it out...
我觉得我应该知道这一点,但我一直无法弄清楚......
I want to get the name of a method--which happens to be an integration test--from inside it so it can print out some diagnostic text. I can, of course, just hard-code the method's name in the string, but I'd like to make the test a little more DRY if possible.
我想从它内部获取方法的名称——它恰好是一个集成测试——以便它可以打印出一些诊断文本。当然,我可以在字符串中硬编码方法的名称,但如果可能的话,我想让测试更加干燥。
采纳答案by spiv
The answers involving introspection via inspectand the like are reasonable. But there may be another option, depending on your situation:
涉及introspection viainspect等的答案是合理的。但可能还有另一种选择,具体取决于您的情况:
If your integration test is written with the unittestmodule, then you could use self.id()within your TestCase.
如果您的集成测试是使用unittest模块编写的,那么您可以self.id()在您的 TestCase 中使用。
回答by mhawke
This seems to be the simplest way using module inspect:
这似乎是使用 module 的最简单方法inspect:
import inspect
def somefunc(a,b,c):
print "My name is: %s" % inspect.stack()[0][3]
You could generalise this with:
您可以将其概括为:
def funcname():
return inspect.stack()[1][3]
def somefunc(a,b,c):
print "My name is: %s" % funcname()
Credit to Stefaan Lippenswhich was found via google.
感谢斯特凡Lippens这是通过谷歌找到。
回答by nosklo
This decorator makes the name of the method available inside the function by passing it as a keyword argument.
此装饰器通过将其作为关键字参数传递,使该方法的名称在函数内可用。
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
You would use it this way:
你会这样使用它:
@pass_func_name
def sum(a, b, _func_name):
print "running function %s" % _func_name
return a + b
print sum(2, 4)
But maybe you'd want to write what you want directly inside the decorator itself. Then the code is an example of a way to get the function name in a decorator. If you give more details about what you want to do in the function, that requires the name, maybe I can suggest something else.
但也许您想直接在装饰器内部编写您想要的内容。然后代码是在装饰器中获取函数名称的方法示例。如果您提供有关您想在函数中执行的操作的更多详细信息,则需要名称,也许我可以提出其他建议。
回答by Kevin Little
# 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()
Output:
输出:
$ python foo.py
Here in testit, file foo.py, line 17
WHERE says 'foo.py/18 testit()'
Use "back = 1" to find info regarding two levels back down the stack, etc.
使用“back = 1”来查找有关返回堆栈的两个级别的信息等。

