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

jim*_*iat 3 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)
Run Code Online (Sandbox Code Playgroud)

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

PM *_*ing 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)
Run Code Online (Sandbox Code Playgroud)

产量

2
3
4
5
6
7
8
9
0.000479936599731
Run Code Online (Sandbox Code Playgroud)

一开始@decorator语法可能有点神秘,但你最终会习惯它.:)

干

@laptime
def loop(a,b):
    for i in range(a,b):
        print(i)
Run Code Online (Sandbox Code Playgroud)

完全等同于:

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

loop = laptime(loop)
Run Code Online (Sandbox Code Playgroud)