如何从Python函数或方法中获取函数或方法的名称?
我觉得我应该知道这一点,但我一直无法弄清楚…
我想从里面得到一个方法的名称 – 这恰好是一个集成testing – 所以它可以打印出一些诊断文本。 当然,我可以在string中对方法的名字进行硬编码,但是如果可能的话,我想让testing更加干燥。
涉及通过inspect
等内省的答案是合理的。 但是根据您的情况,可能还有其他select:
如果你的集成testing是用unittest模块编写的,那么你可以在你的TestCase中使用self.id()
。
这似乎是使用模块inspect
最简单的方法:
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()
感谢通过谷歌发现的Stefaan Lippens 。
这个装饰器通过将函数作为关键字parameter passing给函数内部的方法。
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)
但是也许你想直接在装饰器里面写你想要的东西。 然后代码是一个获取装饰器中的函数名称的例子。 如果你提供了关于你想要在函数中做什么的更多细节,那就需要这个名字,也许我可以build议一些其他的东西。
# 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”来查找有关两个层次的信息
我认为traceback
模块可能有你在找什么。 尤其是, extract_stack
函数看起来好像可以完成这项工作。