我正在尝试访问执行装饰器函数内的函数的时间。
我按照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/