Discuss / Python / 装饰器有参无参放一起,没想出来怎么做,抄的别人,虽做出来了,但是稀里糊涂不知道为什么

装饰器有参无参放一起,没想出来怎么做,抄的别人,虽做出来了,但是稀里糊涂不知道为什么

Topic source

夏蝉live

#1 Created at ... [Delete] [Delete and Lock User]
#闭包:参数和变量保存在内,返回函数本身;装饰器是函数的包装;
import functools        #保存原函数的签名
import time

def log(text):
    if isinstance(text,str):
        #text 是 str 需要多执行一层 decorator
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args,**kw):
                p(text)
                p('Action : %s()'%func.__name__)
                tmp = func(*args,**kw)
                p('Stop : %s()'%func.__name__)
                return tmp
            return wrapper
        return decorator
    else:
        #text不是str,就是function
        func = text
        @functools.wraps(func)
        def wrapper(*args,**kw):
            start_time = time.time()
            tmp = func(*args,**kw)
            end_time = time.time()
            p('No parameter,return Run-time:',end_time-start_time)
            return tmp
        return wrapper

@log
def function1() : 
    p(function1.__name__, 'is runing!')
    return 'return function1()'

@log('Have a parameter')
def function2() : 
    p(function2.__name__, 'is runing!')
    return 'return function2()'

p(function1())
p(function2())

夏蝉live

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

37: function1 is runing! 38: No parameter,return Run-time: 0.0 39: return function1() 40: Have a parameter 41: Action : function2() 42: function2 is runing! 43: Stop : function2() 44: return function2() 请按任意键继续. . .

你的代码已经说明了,这么清晰的逻辑为何不明白,对装饰器如果还没看顺眼就先这样表示 @log('parameters') def func(): pass 等价于func=log('parameters')(func)

@log def func(): pass 等价于 func=log(func)

当你再去调用新的func的时候log的参数就明了了,这样你的判断不就直接跳到对应的分支的吗,剩下就是装饰器的内部的逻辑了。

谢谢


  • 1

Reply