在Python中的另一个函数中获取调用函数名称?

时间:2009-05-22 23:19:16

标签: python debugging

如果你有两个功能,如:

def A
def B

和A调用B,你能得到谁在B里面调用B,比如:

def A () :
    B ()

def B () :
    this.caller.name

5 个答案:

答案 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)

有两种方法,使用sysinspect模块:

  • 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')