如果你有两个功能,如:
def A
def B
和A调用B,你能得到谁在B里面调用B,比如:
def A () :
B ()
def B () :
this.caller.name
答案 0 :(得分:147)
您可以使用inspect模块获取所需信息。它的stack方法返回一个帧记录列表。
对于 Python 2 ,每个帧记录都是一个列表。每条记录中的第三个元素是调用者名称。你想要的是这个:
>>> import inspect
>>> def f():
... print inspect.stack()[1][3]
...
>>> def g():
... f()
...
>>> g()
g
对于 Python 3.5 + ,每个帧记录都是named tuple,因此您需要替换
print inspect.stack()[1][3]
带
print(inspect.stack()[1].function)
上面的代码。
答案 1 :(得分:21)
有两种方法,使用sys
和inspect
模块:
sys._getframe(1).f_code.co_name
inspect.stack()[1][3]
stack()
表单的可读性较差且与实现有关,因为它调用了sys._getframe()
,请参阅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)
答案 2 :(得分:13)
注意(2018年6月):今天,我可能会使用inspect
模块,请参阅其他答案
sys._getframe(1).f_code.co_name
,如下例所示:
>>> def foo():
... global x
... x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>
重要提示:从_getframe
方法名称中显而易见(嘿,它以下划线开头),它不是一种应该不加思索地依赖的API方法。
答案 3 :(得分:7)
这对我有用! :d
>>> def a():
... import sys
... print sys._getframe(1).f_code.co_name
...
>>> def b():
... a()
...
...
>>> b()
b
>>>
答案 4 :(得分:2)
您可以使用日志记录模块并在BaseConfig()中指定%(funcName)s选项
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')