我觉得我应该知道这一点,但我无法弄明白......
我想从内部获取方法的名称 - 恰好是集成测试 - 因此它可以打印出一些诊断文本。当然,我可以在字符串中对方法的名称进行硬编码,但如果可能的话,我想让测试更加干燥。
答案 0 :(得分:55)
这似乎是使用模块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。
答案 1 :(得分:23)
涉及通过inspect
等进行内省的答案是合理的。但根据您的具体情况,可能还有其他选择:
如果您的集成测试是使用unittest模块编写的,那么您可以在TestCase中使用self.id()
。
答案 2 :(得分: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
您可以这样使用它:
@pass_func_name
def sum(a, b, _func_name):
print "running function %s" % _func_name
return a + b
print sum(2, 4)
但也许你想在装饰者本身内直接写下你想要的东西。然后代码是一个在装饰器中获取函数名的方法的示例。如果你提供关于你想在函数中做什么的更多细节,那就需要这个名字,也许我可以推荐别的东西。
答案 3 :(得分: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()
输出:
$ python foo.py
Here in testit, file foo.py, line 17
WHERE says 'foo.py/18 testit()'
使用“back = 1”查找关于堆栈等两个级别的信息,等等。
答案 4 :(得分:3)
我认为traceback
模块可能包含您正在寻找的内容。特别是,extract_stack
函数看起来会完成这项工作。