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)



运行效果:

image





代码 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")



运行效果:

image







@functools.wraps 一般用于对内嵌函数的包装上,(内嵌函数是另一个函数的内部,即定义在一个函数内部的一个函数,即为内嵌函数)


该装饰器的作用是将外层包装的函数的 __doc__ __name__ __annotations__ 这三个属性copy并赋值给@functools.wraps所包装的函数,即使用外层装饰器需要包装的函数的这三个属性将@functools.wraps所包装的函数的这三个属性覆盖掉。



posted on 2025-12-10 21:47  Angry_Panda  阅读(2)  评论(0)    收藏  举报

导航