第二题想的脑袋疼。。。
Topic source#两者共存,腿子的方法:或可用默认参数text=''或者可变参数*args
import functools
def log(str=''):
def decorater(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
if str != '':
print('text = %s,begin call = %s' % (str,func.__name__))
func(*args,**kwargs)
print('text = %s,end call = %s' % (str,func.__name__))
else:
print('begin call = %s' % (func.__name__))
func(*args,**kwargs)
print('end call = %s' % (func.__name__))
return wrapper
return decorater
#总觉的if else这一块的代码块可以简化,但是...饿了啊啊
#*args的方法还不会使用,*args是tuple,而传入的是str
>>> @log('today')
def now():
print('2017-5-11')
>>> now()
text = today,begin call = now
2017-5-11
text = today,end call = now
>>> @log()
def now():
print('2017-5-11')
>>> now()
begin call = now
2017-5-11
end call = now
这种方法并不支持不带参数的装饰器, 在测试时,如果使用@log, 会报TypeError: decorator() missing 1 required positional argument: 'func'的错, @log()不会报错,但是这种形式已经是带参数的装饰器了。 个人理解,欢迎指正批评。
正确的解答还是楼下的。
个人见解
在此插入代码
import functools
def log(text): def decorator(func): @functools.wraps(func) def wrapper(args, kw): if len(text) > 0: print('begin call %s %s():' % (text[0], func.name)) else: print('begin call %s():' % func.name) result = func(*args, kw) if len(text) > 0: print('end call %s %s():' % (text[0], func.name)) else: print('end call %s():' % func.name) return result
return wrapper
return decorator
- 1
LeborYi
先奉上答案,慢慢思考如何实现两者共存