我已经写了一大段代码,我希望改进我的详细输出。我在函数的开头和结尾有一个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