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

9 投票
4 回答
10434 浏览
提问于 2025-04-17 09:41

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

我找到的唯一合理的方法是:

def foobar():
  print 'hello world'

  print foobar.__name__

有没有什么方法可以做到这一点,以便在当前函数中更方便地复制和粘贴这一行呢?

就像C语言中的那个写法 printf("%s", __func__)

4 个回答

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

撰写回答