python - 装饰器——试图理解这个简单的例子

标签 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)

我尝试了很多方法让它工作,但它们都返回了我不明白的有趣结果......我知道关于 SO 的主题还有多个其他问题,但不知何故它们对我没有帮助更好地了解应该如何完成。

最佳答案

装饰器函数将函数作为参数并返回修改后的函数。您的 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)

关于python - 装饰器——试图理解这个简单的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43608970/

相关文章:

python - functools.wraps 有什么作用?

java - 使用 Guava ForwardingList 装饰集合的意外行为

C++ 装饰器添加到 std::vector

python - 对类方法使用 pydispatch 和装饰器

python - 使用 django-axes 登录 Django

python - Shell脚本在目录中查找文件,如何传入python脚本

python - PyQt5。如何在 QHBoxLayout 中居中按钮?

python - pandas 中字符串到日期时间的转换

python - Django REST Framework 如何将上下文添加到 ViewSet

python - Django 装饰器根据用户类型进行重定向