Discuss / Python / 参考楼下层主的,可以使用了

参考楼下层主的,可以使用了

Topic source

两问合在一起的代码如下

#-*-coding:utf-8-*-
#装饰器
import functools

def log(arg):
    def decorator(func=arg):
        text='call' if func==arg else arg
        @functools.wraps(func)
        def wrapper(*args,**kw):
            print('%s %s():' % (text,func.__name__))
            return (func(*args, **kw),print('end %s %s():' % (text, func.__name__)))[0]
        return wrapper
    return decorator() if callable(arg) else decorator

比较疑惑的是后面的return语句

 decorator() if callable(arg) else decorator

有懂的麻烦帮忙解释下,谢谢

春之逝水

#2 Created at ... [Delete] [Delete and Lock User]

这里argslog()的参数,字面意思就是说如果args为可调用对象(这里指args是函数),说明log是以

@log
def func():
    pass

这样的形式调用的(等价于func = log(func);此时log(args)里的参数是func,正是可调用对象)。对于这种情况,log(func)应该返回一个wrapper函数,因此必须返回decorator()调用结果

如果args不可调用(就是字符串了),根据要求应该返回一个装饰器,这里就是decorator这个函数对象。因此

@log('excute')
def func():
    pass

这里,执行@log('excute')先返回decorator,然后这个decorator才再装饰func(),即

@decorator
def func():
    pass

葛斯特

#3 Created at ... [Delete] [Delete and Lock User]

层主牛,代码写的非常精妙!

text='call' if func==arg else arg 这一句为什么不用 if callable(arg) 刚才已经赋值了func = arg 不是一定就相等了吗


  • 1

Reply