python - 在Python中使用装饰器函数时,如何获取包装器函数返回的信息?

标签 python python-decorators

我正在尝试访问执行装饰器函数内的函数的时间。

我按照this post中的指示进行操作因为我无法让函数接受我传递给它的参数。现在我不确定如何从调用函数中获取数据。

这是我的代码:

import time
from functools import wraps

def sort_timer(func):
    def outer(func):
        @wraps(func)
        def inner(*args, **kwargs):
            start = time.perf_counter()
            func(*args, **kwargs)
            finish = time.perf_counter()
            return start - finish
        return inner
    return outer

@sort_timer
def bubble_sort(a_list):
    """Sorts a_list in ascending order"""
    for pass_num in range(len(a_list) - 1):
        for index in range(len(a_list) - 1 - pass_num):
            if a_list[index] > a_list[index + 1]:
                temp = a_list[index]
                a_list[index] = a_list[index + 1]
                a_list[index + 1] = temp

list1 = [60, 19, 22, 14, 43, 27, 3, 77]
x = bubble_sort(list1)
print(x)

看起来返回的是内部函数。以下是控制台中记录的内容:

<function sort_timer.<locals>.outer.<locals>.inner at 0x0000027167770310>

任何见解将不胜感激。谢谢。

最佳答案

answer中的代码您所指的专门用于向装饰器提供参数。只要您将 () 放在 @sort_timer 之后,它就会起作用...并且按照当前编写的方式提供一个参数。下面是一个示例,为清楚起见,第一个 func 参数已重命名:

def sort_timer(parameter):
    def outer(func):
        @wraps(func)
        def inner(*args, **kwargs):
            start = time.perf_counter()
            func(*args, **kwargs)
            finish = time.perf_counter()
            return start - finish
        return inner
    return outer

@sort_timer(13) # for example
...

也就是说,在所示的代码中,您并没有真正使用双包装技术来获得任何优势。除非您计划向装饰器本身(而不是装饰函数)提供参数,否则您可以像这样简化:

def sort_timer(func):
    @wraps(func)
    def inner(*args, **kwargs):
        start = time.perf_counter()
        func(*args, **kwargs)
        finish = time.perf_counter()
        return start - finish
    return inner

关于python - 在Python中使用装饰器函数时,如何获取包装器函数返回的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73045640/

相关文章:

python - 以下两个 format() 方法有什么区别?

Python Pandas 更新数据框列类型

python - 装饰器如何标记一个函数?

Python - 计算函数通过装饰器的次数

python - 定义在初始化时按顺序计算属性的类的最佳实践

python - Pygame:通过网络发送图像 PodSixNet

c++ - "for num in [1,4,5]"C++ 中的 Python 等价物?

python - 使用 Python 和 mySQL(和 windows 作为操作系统),cursor.execute() 没有返回任何结果,但它正在连接

python - 检测路由是否不是最外层/错误的 Flask 装饰器的 "order"

python - @classmethod 没有调用我的自定义描述符的 __get__