【问题标题】:Equivalent of __func__ (from C) in Python等价于 Python 中的 __func__(来自 C)
【发布时间】:2012-01-06 14:30:43
【问题描述】:

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

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

def foobar():
  print 'hello world'

  print foobar.__name__

有没有什么东西可以对当前函数做同样的事情来改进该行的复制和粘贴?

类似于 C 中的 printf("%s", __func__)

【问题讨论】:

    标签: python python-2.x


    【解决方案1】:

    您可以尝试的一件事是创建一个这样做的装饰器:

    def traceme(func):
      def newfunc(*args, **kwargs):
        ret = func(*args, **kwargs)
        print func.__name__
        return ret
      return newfunc
    
    @traceme
    def foobar():
      print 'hello world'
    

    【讨论】:

    • __func__ 实际上是在 C99 中,它完全符合您的预期。
    • 这是个好消息,我完全错过了。谢谢告知。答案已更新:)
    • 你所做的是decorator,而不是annotation
    • @Krumelur 我认为根据上下文,这会更好,我只是不打印我得到的字符串,因此它不太有用。但无论如何,这是一个伟大而有创意的答案。
    • @Krumelur。感谢这段代码。有没有办法在你的例子中打印 args 和 kwargs ?我有几个函数在 try-catch 块中包含几行代码。 catch 部分比代码行长得多,并且所有函数都相似。我想将您的示例用于 try-catch 部分,但我想在捕获异常时打印(除其他外)参数以 func 。
    【解决方案2】:

    sys._getframe 可以做到:

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

    【讨论】:

    • 如何打印它所属的类?
    【解决方案3】:

    嗯,是的,有办法……

    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 中做你想做的事=)

    【讨论】:

    • 我用它来创建文件名作为日志输出,所以跟踪在这里没有多大帮助,但还是谢谢你。
    猜你喜欢
    • 2016-10-31
    • 2012-05-11
    • 2011-11-25
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多