If you have 2 functions like:
def A
def B
and A calls B, can you get who is calling B inside B, like:
def A () :
B ()
def B () :
this.caller.name
If you have 2 functions like:
def A
def B
and A calls B, can you get who is calling B inside B, like:
def A () :
B ()
def B () :
this.caller.name
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.
inspect.currentframe().f_back.f_code.co_name, which is independent of Python version or implementation.inspect.currentframe() depends from Python implementation, since if you read the source code of inspect.py, they both use sys._getframe()print(inspect.stack()[1].function, inspect.stack()[1].filename)There are two ways, using sys and inspect modules:
sys._getframe(1).f_code.co_nameinspect.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)
timeit for instance)? I think it's faster because it doesn't seem to incurr function calls and two list lookups. But things can get hidden in Python so the best is to timeit it. Let us know what you find.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.
.f_code.co_qualname, as it provides the fully qualified function name, including the class. See here.This works for me! :D
>>> def a():
... import sys
... print sys._getframe(1).f_code.co_name
...
>>> def b():
... a()
...
...
>>> b()
b
>>>
inspect.stack() by at least a x1000you 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')