在别的大佬的基础上修改的...这个函数可以同时应对@log,@log(),@loga('excute')三种状态(大佬的代码第二种无法执行)
def log(str='execute'): 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 fn(*args, **kw) return wrapper if callable(str): return decorator(str) return decorator
再来点拙见...
关键是两个if callable语句,用来判断调用装饰器时装饰器输入的参数本身是否可被调用。
教程指出,在两层嵌套:把@log放到now()函数的定义处,相当于执行了语句:
@log
now()
now = log(now)
此时装饰器的输入参数即为被装饰函数本身,在if callable下是成立的,能够调用函数本身,那么在wrapper中将执行第一段输出,最下方的也将返回第一个retun后的函数并退出log;若两个if callable都不成立,则会执行第二段。
有点搞不懂的是为何str能够调用时返回的decorator是带参的。
Sign in to make a reply
PlanetOfTheUniverse
在别的大佬的基础上修改的...这个函数可以同时应对@log,@log(),@loga('excute')三种状态(大佬的代码第二种无法执行)
再来点拙见...
关键是两个if callable语句,用来判断调用装饰器时装饰器输入的参数本身是否可被调用。
教程指出,在两层嵌套:把
@log
放到now()
函数的定义处,相当于执行了语句:此时装饰器的输入参数即为被装饰函数本身,在if callable下是成立的,能够调用函数本身,那么在wrapper中将执行第一段输出,最下方的也将返回第一个retun后的函数并退出log;若两个if callable都不成立,则会执行第二段。
有点搞不懂的是为何str能够调用时返回的decorator是带参的。