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

Joa*_*nge 110 python debugging

如果你有两个功能,如:

def A
def B
Run Code Online (Sandbox Code Playgroud)

和A打电话给B,你能得到谁在B里面叫B,比如:

def A () :
    B ()

def B () :
    this.caller.name
Run Code Online (Sandbox Code Playgroud)

Aym*_*ieh 167

您可以使用inspect模块获取所需的信息.它的堆栈方法返回一个帧记录列表.

  • 对于Python 2,每个帧记录都是一个列表.每条记录中的第三个元素是调用者名称.你想要的是这个:

    >>> import inspect
    >>> def f():
    ...     print inspect.stack()[1][3]
    ...
    >>> def g():
    ...     f()
    ...
    >>> g()
    g
    
    Run Code Online (Sandbox Code Playgroud)

  • 在python 3.4上至少这不起作用,它们改变了元组的顺序.现在正在使用命名元组,因此最好使用inspect.stack()[1] .filename (12认同)
  • 实际上,您可能想要`inspect.currentframe()。f_back.f_code.co_name`,它独立于Python版本或实现。 (3认同)

Eri*_*ric 22

有两种方式,使用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)
Run Code Online (Sandbox Code Playgroud)

  • (getframe) 0.00419473648071 : (inspect) 29.3846197128 这是 4000 次调用时两者之间的比率。 (6认同)

Pio*_*sen 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'
>>>  
Run Code Online (Sandbox Code Playgroud)

重要提示:从_getframe方法名称中可以明显看出(嘿,它以下划线开头),它不是一种应该不加思索地依赖的API方法.

  • [sys._getframe](http://docs.python.org/library/sys.html#sys._getframe)"并不保证在所有Python实现中都存在" - 我认为这一点很重要. (11认同)

Ale*_*ory 7

这适合我!:d

>>> def a():
...     import sys
...     print sys._getframe(1).f_code.co_name
...
>>> def b():
...     a()
...
...
>>> b()
b
>>>
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用日志记录模块并在 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')
Run Code Online (Sandbox Code Playgroud)