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



我已经写了一大段代码,我希望改进我的详细输出。我在函数的开头和结尾有一个if verbose: print '**** function_name ****'的想法,甚至定义了一个函数来使其更容易调用(我在这里使用的是kindall编写的非常性感的详细打印)

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

演示:

verbose True时:

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

verbose False时:

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

相关内容

  • 没有找到相关文章

最新更新