1

我已经写了一大段代码,我希望改进我的详细输出。我有一个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()一次?再多的修补也没有让我找到答案!

4

1 回答 1

4

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

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

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

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
于 2016-07-11T08:25:11.067 回答