Determine function name from within that function (without using traceback) Determine function name from within that function (without using traceback) python python

Determine function name from within that function (without using traceback)


import inspectdef foo():   print(inspect.stack()[0][3])   print(inspect.stack()[1][3]) #will give the caller of foos name, if something called foo


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.


There are few ways to get the same result:

import sysimport inspectdef 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

Update 08/2021 (original post was written for Python2.7)

Python 3.9.1 (default, Dec 11 2020, 14:32:07)[GCC 7.3.0] :: Anaconda, Inc. on linuxpython -m timeit -s 'import inspect, sys' 'inspect.stack()[0][0].f_code.co_name'500 loops, best of 5: 390 usec per looppython -m timeit -s 'import inspect, sys' 'inspect.stack()[0][3]'500 loops, best of 5: 398 usec per looppython -m timeit -s 'import inspect, sys' 'inspect.currentframe().f_code.co_name'2000000 loops, best of 5: 176 nsec per looppython -m timeit -s 'import inspect, sys' 'sys._getframe().f_code.co_name'5000000 loops, best of 5: 62.8 nsec per loop