1.请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志。
def log_decorator(func): def wrapper(*args, **kwargs): print('begin call') result = func(*args, **kwargs) print('end call') return result return wrapper
2.再思考一下能否写出一个@log的decorator,使它既支持:
@log def f():
又支持:
@log('execute') def f():
def log(arg=None): def decorator(func): def wrapper(*args, **kwargs): if arg is None: print('begin call') else: print(f'begin {arg}') result = func(*args, **kwargs) if arg is None: print('end call') else: print(f'end {arg}') return result return wrapper if callable(arg): return decorator(arg) else: return decorator
最后这个貌似有问题,无论@log后加不加参数,arg都不会为None,因为即使没有参数,f也会被赋给arg,这样也会输出'begin {arg}'
Sign in to make a reply
Super-String
1.请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志。
2.再思考一下能否写出一个@log的decorator,使它既支持:
又支持: