装饰者 - 试图理解这个简单的例子

时间:2017-04-25 11:06:53

标签: python decorator

基本上我正在尝试实现时序装饰器:

def laptime(func):
    def inner(*args):
        start = time.time()
        r = func(*args)
        print time.time()-start
    return r

@laptime
def loop(a,b):
    for i in range(a,b):
        print (i)

loop(2, 1000)

我尝试了许多方法让它发挥作用,但它们都返回了我不理解的有趣结果......我知道关于这个主题还有其他多个问题,但不知怎的,它们对我来说没什么用。更好地掌握如何做到这一点。

1 个答案:

答案 0 :(得分:6)

装饰器函数将函数作为参数并返回修改后的函数。您的laptime未返回修改后的函数(inner),并且return r上的缩进错误。

这是修复后的版本。我也改变了它,因此它可以在Python 2& Python 3。

import time

def laptime(func):
    def inner(*args):
        start = time.time()
        r = func(*args)
        print(time.time() - start)
        return r
    return inner

@laptime
def loop(a,b):
    for i in range(a,b):
        print(i)

loop(2, 10)

<强>输出

2
3
4
5
6
7
8
9
0.000479936599731

@decorator语法起初可能有点神秘,但你最终会习惯它。 :)

否则

@laptime
def loop(a,b):
    for i in range(a,b):
        print(i)

完全等同于:

def loop(a,b):
    for i in range(a,b):
        print(i)

loop = laptime(loop)