小结:1.请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志。
def log(f):
@log
def f():
结果:开始前会打印begin call 但是结束后不会有end call。分析原因:在return f(*args,**kw)语句时对应的f函数就已经返回(执行完毕),而打印'end call'只在第一次(初始化log(f)的时候)时执行了,而后每次调用f()都不执行该语句。解决办法暂时没找到。
----------------------------------------------------------------------------------------------------------------------------------------
找到了解决办法
val = f(*args,**kw)
print 'end call'
return val
就可以啦!
----------------------------------------------------------------------------------------------------------------------------------------
2.能否写出一个@log的decorator,使它既支持:
@log
def f():
pass
又支持:
@log('execute')
def f():
pass
import functools
def log(text):
写的略复杂,没想出来还能不能再精简了。传入参数后先判断实参类型来区别是log(f)还是log('execute')(f),从而确认是三层嵌套还是两层嵌套的装饰器。
本文深入探讨了Python中装饰器的应用,包括如何创建一个能够在函数调用前后打印日志信息的基本装饰器,以及如何设计更复杂的装饰器以支持不同类型的参数输入。
536

被折叠的 条评论
为什么被折叠?



