Determine function name from within that function (without using traceback)
In Python, without using the traceback
module, is there a way to determine a function's name from within that function?
Say I have a module foo with a function bar. When executing foo.bar()
, is there a way for bar to know bar's name? Or better yet, foo.bar
's name?
#foo.py
def bar():
print "my name is", __myname__ # <== how do I calculate this at runtime?
Python doesn't have a feature to access the function or its name within the function itself. It has been proposed but rejected. If you don't want to play with the stack yourself, you should either use "bar"
or bar.__name__
depending on context.
The given rejection notice is:
This PEP is rejected. It is not clear how it should be implemented or what the precise semantics should be in edge cases, and there aren't enough important use cases given. response has been lukewarm at best.
import inspect
def foo():
print inspect.stack()[0][3]
There are a few ways to get the same result:
from __future__ import print_function
import sys
import inspect
def what_is_my_name():
print(inspect.stack()[0][0].f_code.co_name)
print(inspect.stack()[0][3])
print(inspect.currentframe().f_code.co_name)
print(sys._getframe().f_code.co_name)
Note that the inspect.stack
calls are thousands of times slower than the alternatives:
$ python -m timeit -s 'import inspect, sys' 'inspect.stack()[0][0].f_code.co_name'
1000 loops, best of 3: 499 usec per loop
$ python -m timeit -s 'import inspect, sys' 'inspect.stack()[0][3]'
1000 loops, best of 3: 497 usec per loop
$ python -m timeit -s 'import inspect, sys' 'inspect.currentframe().f_code.co_name'
10000000 loops, best of 3: 0.1 usec per loop
$ python -m timeit -s 'import inspect, sys' 'sys._getframe().f_code.co_name'
10000000 loops, best of 3: 0.135 usec per loop
链接地址: http://www.djcxy.com/p/9402.html
上一篇: 从字典中删除项目
下一篇: 从该函数中确定函数名称(不使用追溯)