Python 中的 __func__(来自 C)的等价物

问题描述 投票:0回答:4

我想为 python 创建某种调试输出,并希望将函数名传递给另一个函数以进行输出。

我发现这样做的唯一合理方法是:

def foobar():
  print 'hello world'

  print foobar.__name__

是否有一些东西可以对当前函数执行相同的操作来改进该行的复制和粘贴?

就像 C 语言的等价物

printf("%s", __func__)

python python-2.x
4个回答
11
投票

嗯,是的,有办法...

print sys._getframe().f_code.co_name

您甚至可以将其设为一个函数(获取前一帧的名称):

def function_name():
    return sys._getframe().f_back.f_code.co_name

愚蠢的例子只是为了表明它的工作原理:

>>> def bar():
...     return function_name()
... 
>>> bar()
'bar'

(请注意,Krumelur 的答案中显示的装饰器是解决问题的更好方法,但它可以在Python中做你想做的事情=)


10
投票

sys._getframe 可以做到这一点:

import sys

def foobar():
    print sys._getframe().f_code.co_name

9
投票

您可以尝试的一件事是创建一个执行此操作的装饰器:

def traceme(func):
  def newfunc(*args, **kwargs):
    ret = func(*args, **kwargs)
    print func.__name__
    return ret
  return newfunc

@traceme
def foobar():
  print 'hello world'

0
投票

自 2023 年起的替代方法

从版本 3.5 开始,我们有另一种选择来使用 inspect

来实现相同的目的

要获取函数名称(

__func__ equivalent in C
),我们可以使用

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

我们可以用它来满足行号等相关需求(

__line__ equivalent in C
)

return inspect.stack()[1][2]

更多直播元素详情可查询。 (参考:Inspect 的官方 Python 文档链接。)

完整工作代码:

import inspect

def get_function_name():
    return inspect.stack()[1][3]

def get_my_name():
    print(get_function_name())

get_my_name()

输出:

获取我的名字

© www.soinside.com 2019 - 2024. All rights reserved.