Discuss / Python / 最后一个关于不用@语法下定义的函数

最后一个关于不用@语法下定义的函数

Topic source

在别的大佬的基础上修改的...这个函数可以同时应对@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()函数的定义处,相当于执行了语句:

now = log(now)

此时装饰器的输入参数即为被装饰函数本身,在if callable下是成立的,能够调用函数本身,那么在wrapper中将执行第一段输出,最下方的也将返回第一个retun后的函数并退出log;若两个if callable都不成立,则会执行第二段。

有点搞不懂的是为何str能够调用时返回的decorator是带参的。


  • 1

Reply