import sys
# for current func name, specify 0 or no argument.
# for name of caller of current func, specify 1.
# for name of caller of caller of current func, specify 2. etc.
currentFuncName = lambda n=0: sys._getframe(n + 1).f_code.co_name
def testFunction():
print "You are in function:", currentFuncName()
print "This function's caller was:", currentFuncName(1)
def invokeTest():
testFunction()
invokeTest()
# end of file
18 回答
Python没有在函数本身中访问函数或其名称的功能 . 它一直是proposed但被拒绝了 . 如果您不想自己使用堆栈,则应根据上下文使用
"bar"
或bar.__name__
.给出的拒绝通知是:
有几种方法可以获得相同的结果:
请注意,
inspect.stack
调用比其他选项慢几千倍:您可以使用the approach that @Andreas Jung shows获取使用the approach that @Andreas Jung shows定义的名称,但这可能不是调用该函数的名称:
这种区别对你来说是否重要我不能说 .
我想要一个非常相似的东西,因为我想将函数名称放在我的代码中的许多地方的日志字符串中 . 可能不是最好的方法,但这里有一种获取当前函数名称的方法 .
我把这个方便的实用程序放在附近:
用法:
我找到了一个可以编写函数名的包装器
这将打印出来
print(inspect.stack()[0].function)
似乎也有用(Python 3.5) .这实际上是从问题的其他答案中得出的 .
这是我的看法:
这个版本比使用inspect.stack()的可能优势在于它应该快几千倍[参见Alex Melihoff关于使用sys._getframe()和使用inspect.stack()的帖子和时间 .
在IDE中,代码输出
测试:
输出:
我想
inspect
是最好的方法 . 例如:这是一种面向未来的方法 .
将@CamHart 's and @Yuval'的建议与@ RoshOxymoron的accepted answer结合使用可以避免:
_hidden
以及可能已弃用的方法索引到堆栈中(可以在将来的pythons中重新排序)
所以我认为这对未来的python版本很有用(在2.7.3和3.3.2上测试):
你可以使用装饰者:
我做了CamHart说的话:
输出:
我做自己的方法用于在多重继承场景中调用超级安全(我把所有的代码)
样品用量:
测试它:
输出:
在每个@with_name修饰方法中,您可以访问self .__ fname__作为当前函数名称 .
使用此(基于#Ron Davis的回答):
我最近尝试使用上面的答案从该函数的上下文访问函数的docstring,但由于上面的问题只返回名称字符串,它不起作用 .
幸运的是,我找到了一个简单的解如果像我一样,你想引用函数而不是简单地获取表示名称的字符串,你可以将eval()应用于函数名的字符串 .