如何使用详细 Python 打印函数的开始和结束?

How do I print start and end of function with verbose, Python?

我已经写了一大堆代码,我希望改进我的冗长输出。我想到了在函数的开始和结束处使用 if verbose: print '**** function_name ****',甚至定义了一个函数以使其更易于调用(我正在使用 kindall here 编写的非常性感的冗长打印)

def verbwrap(function, side):
    if side=='start':
        verboseprint(' ******  %s  ******' %(function))
    if side=='end': 
        verboseprint(' ^^^^^^  %s  ^^^^^^' %(function))

打算这样使用它:

import inspect

def test(lst):
    verbwrap(inspect.currentframe().f_code.co_name,'start')
    for i in lst:
        print i
    verbwrap('test', 'end') #equivalent to above, but easier to write :(

有没有办法让我只调用一次重做的verbwrap()?没有多少修补让我找到答案!

考虑到您只想在函数的开头和结尾打印一些内容,那么最好的方法是使用装饰器。

def verbwrap(function):
    def wrapper(*args, **kwargs):
        verboseprint(' ******  %s  ******' %(function.__name__))
        result = function(*args, **kwargs)
        verboseprint(' ^^^^^^  %s  ^^^^^^' %(function.__name__))
        return result
    return wrapper

现在将上面的装饰器与您要调试的任何函数一起使用:

@verbwrap
def test(lst):
    for i in lst:
        print i

演示:

verboseTrue时:

 ******  test  ******
1
2
3
 ^^^^^^  test  ^^^^^^

verboseFalse时:

1
2
3

您可以通过在 wrapper 函数中计算 verbose 的值来使其更加动态,使用这种方法您可以决定在实际调用函数时调试或不调试。

def verbwrap(function):
    def wrapper(*args, **kwargs):
        # Calculate the value of `verbose` here.
        # Say you're reading it from a config etc
        verbose = False
        if verbose:
            print ' ******  %s  ******' %(function.__name__)
            result = function(*args, **kwargs)
            print ' ^^^^^^  %s  ^^^^^^' %(function.__name__)
            return result
        else:
            return function(*args, **kwargs)
    return wrapper