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

在Python中的另一个函数中获取调用方函数名?,python,debugging,Python,Debugging,如果您有两个功能,如: def A def B A呼叫B,你能知道谁在B里面呼叫B吗,比如: def A () : B () def B () : this.caller.name 您可以使用该模块获取所需信息。其方法返回帧记录列表 对于Python 2,每个帧记录都是一个列表。每个记录中的第三个元素是调用方名称。你想要的是: >>> import inspect >>> def f(): ... print inspect.s

如果您有两个功能,如:

def A
def B
A呼叫B,你能知道谁在B里面呼叫B吗,比如:

def A () :
    B ()

def B () :
    this.caller.name
您可以使用该模块获取所需信息。其方法返回帧记录列表

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

    >>> import inspect
    >>> def f():
    ...     print inspect.stack()[1][3]
    ...
    >>> def g():
    ...     f()
    ...
    >>> g()
    g
    

  • 对于Python 3.5+,每个帧记录都是

    print inspect.stack()[1][3]
    

    关于上述代码

注意(2018年6月):今天,我可能会使用
检查
模块,请参阅其他答案

sys.\u getframe(1).f\u code.co\u name
如下例所示:

>>> def foo():
...  global x
...  x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>  

重要提示:从
\u getframe
方法名称(嘿,它以下划线开头)可以明显看出,它不是一个应该轻率依赖的API方法。

您可以使用日志模块并在BaseConfig()中指定%(funcName)s选项


有两种方法,使用
sys
inspect
模块:

  • sys.\u getframe(1).f\u code.co\u name
  • inspect.stack()[1][3]
stack()
表单可读性较差,并且依赖于实现,因为它调用了
sys.\u 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)
这对我有用!:D

>>> def a():
...     import sys
...     print sys._getframe(1).f_code.co_name
...
>>> def b():
...     a()
...
...
>>> b()
b
>>>

您有可用的源代码。你为什么需要这样的东西?因为我正在第三方应用程序的python解释器中调试代码,那里没有真正的调试器。相关:。将此标记为重复,因为另一方对此问题有更多的视图和投票。“不保证在所有Python实现中都存在”-我认为这一点需要注意。您无意中说了
%(filename)s option
。它应该是python 3.4上代码示例中的内容:
%(funcName)s
:)至少这不起作用,它们更改了元组的顺序。现在正在使用一个命名元组,因此最好使用inspect.stack()[1].filename实际上,您可能需要
inspect.currentframe().f_back.f_code.co_name
,它独立于Python版本或实现。@1313e:也
inspect.currentframe()
取决于Python实现,因为如果您阅读
inspect.py
的源代码,它们都使用
sys.\u getframe()
谢谢。还发现.filename在.function本身不明确时也有帮助。例如:
print(inspect.stack()[1]。函数,inspect.stack()[1]。filename)
它也可以打印函数的完整路径吗?这是sys.\u getframe(1).f\u code.co\u name比inspect.stack()[1][3]快吗?在匆忙询问之前,你是否尝试过计时(例如使用
timeit
)?我认为它更快,因为它似乎不会引起函数调用和两个列表查找。但是Python中可能隐藏一些东西,所以最好是
timeit
it。让我们知道你发现了什么。我想知道为什么,因为我知道它更快。我不喜欢“似乎”的答案。(getframe)0.00419473648071:(检查)29.3846197128这是4000个电话的两个比率。很棒的发现!我认为它使用的是CPython和Python版本2或3,对结果影响不大。感谢您运行基准测试。这非常有效,但一开始让人感到困惑,因为您可以让b()函数回显它自己的名称。其他回答说使用
inspect.
失败得很惨,因为它没有定义。我想作者忘记了一个依赖性语句。
def stack(context=1):
    """Return a list of records for the stack above the caller's frame."""
    return getouterframes(sys._getframe(1), context)
>>> def a():
...     import sys
...     print sys._getframe(1).f_code.co_name
...
>>> def b():
...     a()
...
...
>>> b()
b
>>>