python 装饰器在wrapper中打印时间使用了 @functools.wraps(func)还会打印两遍的问题
时间: 2024-05-14 13:18:19 浏览: 74
使用python编程打印当前时间
这个问题通常出现在使用了 `@functools.wraps(func)` 修饰装饰器函数时。这是因为 `@functools.wraps(func)` 会将被装饰函数的元信息(比如函数名、参数列表等)复制到装饰器函数中,以便让装饰器函数看起来像是被装饰函数本身。但是,如果你在装饰器函数中也使用了 `@functools.wraps(func)` 修饰函数,那么这个过程就会重复进行,导致元信息被复制两次,从而打印两次时间。
解决这个问题的方法是在装饰器函数中只使用一次 `@functools.wraps(func)`,并将其放在最外层的函数上方。例如:
```python
import functools
import time
def timeit(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {(end_time - start_time):.6f}s")
return result
return wrapper
```
这样,`@functools.wraps(func)` 只会被调用一次,元信息只会被复制一次,打印时间也只会出现一次。
阅读全文