Discuss / Python / 装饰器 作业

装饰器 作业

Topic source

练习

def metric(func):
    @functools.wraps(func)
    def warpper(*args,**kw):
        start = time.time()
        func(*args,**kw)
        end = time.time()
        print('{} executed in {:.4f} ms'.format(func.__name__,end - start))
        return func(*args,**kw)
    return warpper

小结1

def log(func):
    @functools.wraps(func)
    def warpper(*args,**kw):
        print("begin call")
        f = func(*args,**kw)
        print("end call")
        return f
    return warpper

小结2

def log(text = None):
    def decorator(func):
        @functools.wraps(func)
        def warpper(*args,**kw):
            if text != None:
                print('{} {}'.format(text,func.__name__))
            else:
                print('{}'.format(func.__name__))
            return func(*args,**kw)
        return warpper
    return decorator

关于小结2,求助一下同学们。

我第一次是这样写的:

def log(*text):
    def decorator(func):
        @functools.wraps(func)
        def warpper(*args,**kw):
            print('{} {}'.format(text,func.__name__))
            return func(*args,**kw)
        return warpper
    return decorator

@log()
def func1():
    print("没有")

@log('hello')
def func2():
    print("有")

func1()
func2()

我想用可变参数做,代码看起来似乎没啥毛病,但是输出是这样的:

() func1
没有
('hello',) func2
有

为什么装饰器把括号、单引号和逗号这些符号都加进去了?我是哪儿出的毛病?

老师说的是既能@log 又能@log('executed'),你的小结2 和老师说的不一样吧,还是我理解有问题,因为老师说的第一个是不包含括号的额

疾风_90334

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

可变参数是个tuple,直接输出应该就是按tuple的格式输出了。


  • 1

Reply