请编写一个decorator,能在函数调用的前后打印出 'begin call' 和 'end call' 的日志。
再思考一下能否写出一个 @log 的decorator,使它既支持:
@log
def f():
pass
又支持:
@log('execute')
def f():
pass
decorator装饰器作用和用法,我不在这里多说,大家自己看资料。
开始分析练习的第一个要求,只要能打印出来就行,于是把廖老师的例程拷贝过来,增加2个print即可
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print 'begin:'
result = func(*args, **kw)
print 'end'
return result
return wrapper
return decorator
@log('execute')
def now():
print '2017-12-22'
print now()
这个例程,我自己实践过,拷贝即可运行了。其实在看到题的第一刻,我有个想法,如何实现把 'begin call' 和 'end call'当做输入变量传进去,然后按这个要求打印,目前还没研究出来,我的目的是这样
import functools
def log(str1,str2):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
# print 'begin:'
print '%s ' % (str1)
result = func(*args, **kw)
# print 'end'
print '%s ' % (str2)
return result
return wrapper
return decorator
@log('begin call','end call')
def now():
print '2017-12-22'
print now()
这个实现2个输入的,如果想实现N多个,我一直没有好的思路,大家有好的建议,给兄弟回复一下,谢谢。
下面开始研究:
写出一个 @log 的decorator,使它既支持:
@log
def f():
pass
又支持:@log('execute')
def f():
pass
正研究,搞定了,补充
进入第六天的学习,今早,我突然有个灵感,把参数设置为默认,里面再加个判断不就可以通用了吗?
import functools
def log(str=None):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
if(str != None):
print '%s ' % (str)
else:
print '%s %s():' % (str, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
@log()
def now():
print '2017-12-22'
print now()
果然运行成功了,太兴奋了,给大家共享本思路。
很多时候遇到困难,不能解决,不如先放下,换换脑子,说不定会有突发的灵感哦。