Getting the caller function name inside another function in Python? [duplicate]
Solution 1:
You can use the inspect module to get the info you want. Its stack method returns a list of frame records.
-
For Python 2 each frame record is a list. The third element in each record is the caller name. What you want is this:
>>> import inspect >>> def f(): ... print inspect.stack()[1][3] ... >>> def g(): ... f() ... >>> g() g
-
For Python 3.5+, each frame record is a named tuple so you need to replace
print inspect.stack()[1][3]
with
print(inspect.stack()[1].function)
on the above code.
Solution 2:
There are two ways, using sys
and inspect
modules:
sys._getframe(1).f_code.co_name
inspect.stack()[1][3]
The stack()
form is less readable and is implementation dependent since it calls sys._getframe()
, see extract from inspect.py
:
def stack(context=1):
"""Return a list of records for the stack above the caller's frame."""
return getouterframes(sys._getframe(1), context)
Solution 3:
Note (June 2018): today, I would probably use inspect
module, see other answers
sys._getframe(1).f_code.co_name
like in the example below:
>>> def foo():
... global x
... x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>
Important note: as it's obvious from the _getframe
method name (hey, it starts with an underscore), it's not an API method one should be thoughtlessly rely on.
Solution 4:
This works for me! :D
>>> def a():
... import sys
... print sys._getframe(1).f_code.co_name
...
>>> def b():
... a()
...
...
>>> b()
b
>>>
Solution 5:
you can user the logging module and specify the %(funcName)s option in BaseConfig()
import logging
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s')
def A():
logging.info('info')