如何从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函数看起来好像可以完成这项工作。