def log(arg): def decorator(fn): @functools.wraps(fn) def wrapper(*args, **kw): return fn(*args, **kw) return wrapper if callable(arg): return decorator(arg) return decorator
当传入文本时,装饰后执行log('arg')(fn),当没有传入值时,执行log(fn),所以判断第一次传入的参数即arg是不是函数来执行后续操作,用callable函数判断,当arg为函数时说明没有传入参数,直接返回包装函数wapper即return decorator(arg),注意此时的arg和fn指向同一个函数。另一种情况为有输入,则按原始步骤返回decorator即可
Sign in to make a reply
大侦探福尔摩一
当传入文本时,装饰后执行log('arg')(fn),当没有传入值时,执行log(fn),所以判断第一次传入的参数即arg是不是函数来执行后续操作,用callable函数判断,当arg为函数时说明没有传入参数,直接返回包装函数wapper即return decorator(arg),注意此时的arg和fn指向同一个函数。另一种情况为有输入,则按原始步骤返回decorator即可