python 装饰器 —— @functools.wraps
代码 1:
import functools
import time
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"{func.__name__} executed in {elapsed_time:.4f} seconds")
return result
return wrapper
# 使用示例
@timer
def slow_function(duration):
time.sleep(duration)
return "Done"
print(slow_function(2)) # 调用 slow_function(2)
运行效果:

代码 2:
import functools
def log_calls(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args={args} and kwargs={kwargs}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned {result}")
return result
return wrapper
# 使用示例
@log_calls
def add(x, y):
return x + y
@log_calls
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(add(3, 5)) # 调用 add(3, 5)
print(greet("Alice")) # 调用 greet("Alice")
print(greet("Bob", greeting="Hi")) # 调用 greet("Bob", greeting="Hi")
运行效果:

@functools.wraps 一般用于对内嵌函数的包装上,(内嵌函数是另一个函数的内部,即定义在一个函数内部的一个函数,即为内嵌函数)
该装饰器的作用是将外层包装的函数的 __doc__ __name__ __annotations__ 这三个属性copy并赋值给@functools.wraps所包装的函数,即使用外层装饰器需要包装的函数的这三个属性将@functools.wraps所包装的函数的这三个属性覆盖掉。
本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2025-12-10 21:47 Angry_Panda 阅读(2) 评论(0) 收藏 举报
浙公网安备 33010602011771号