练习
Topic source函数调用的前后打印出'begin call'
和'end call'
的日志:
def log(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
print('begin call %s():' % fn.__name__)
res = fn(*args, **kw)
print('begin call %s():' % fn.__name__)
return res
return wrapper
既支持@log()
,又支持@log('execute')
:
def log(text='call'):
def decorator(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
print('%s %s():' % (text, fn.__name__))
return fn(*args, **kw)
return wrapper
return decorator
还是大佬们的方法好:
def log(str):
def decorator(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
if callable(str):
print('call %s():' % fn.__name__)
return fn(*args, **kw)
else:
print('%s %s():' % (str, fn.__name__))
return wrapper
if callable(str):
return decorator(str)
return decorator
廖老师留的作业是要求支持
@log
@log('execute')
而不是
@log()
@log('execute')
这个是有区别的,我的实现是这样的
def log(param):
if callable(param):
def wrapper(*args, **kw):
print('before call')
result = param(*args, **kw)
print('end call')
return wrapper
else:
def decorator(func):
def wrapper(*args, **kw):
print('before %s' % param)
result = func(*args, **kw)
print('after %s' % param)
return result
return wrapper
return decorator
但是感觉不完美,这个wrapper在两个条件下都用到了,貌似是可以提出来的。
def log(param):
if callable(param):
这样的定义方法
在调用的时候,怎样同时支持 @log 和 @log(text) 两种形式的调用法?
试了一下
-- 同时给出带参数@log("XXX")和不带参数的 @log语句定义,默认只会调用不带参数的
还是大佬的 log(str) 方法更精简
不过,这个方法调用的时候也不知道怎样指定装饰器是否带参数?
如果同时给出带参数@log("XXX")和不带参数的 @log语句定义,now()默认只会调用不带参数的
- 1
xian_wen