functools.wraps 和 update_wrapper 之间有什么区别

python

1个回答

写回答

Zx11223344

2025-07-09 16:54

+ 关注

Python
Python

在Python中,functools.wraps和functools.update_wrapper都是用于装饰器的工具函数,用于复制一个函数的元数据到另一个函数上,以便保留原始函数的属性和文档字符串。尽管它们的目的相似,但它们的实现方式和用法有所不同。

首先,我们来看一下functools.wraps函数。wraps是一个装饰器函数,它接受一个函数作为参数,并返回一个装饰器。当我们使用wraps装饰器来装饰一个函数时,它会自动将被装饰函数的元数据复制到装饰器函数中。这意味着装饰器函数将保留被装饰函数的名称、文档字符串、参数列表等属性。

接下来,让我们来看一下functools.update_wrapper函数。update_wrapper函数接受两个参数:一个源函数和一个目标函数。它会将源函数的元数据复制到目标函数上,并返回更新后的目标函数。与wraps不同的是,update_wrapper函数返回的是一个函数对象,而不是一个装饰器。

下面是一个简单的例子,演示了functools.wraps和functools.update_wrapper的使用:

Python

import functools

def decorator(func):

@functools.wraps(func)

def wrapper(*args, <strong>kwargs):

"""This is a wrapper function."""

print("Decorator wrapper")

return func(*args, </strong>kwargs)

return wrapper

def my_function():

"""This is my function."""

print("Original function")

decorated_function = decorator(my_function)

print(decorated_function.__name__) # 输出: my_function

print(decorated_function.__doc__) # 输出: This is my function.

在上面的例子中,decorator函数是一个装饰器,它使用wraps装饰器修饰了wrapper函数。wrapper函数是一个内部函数,它将被装饰函数的元数据复制到自身。然后,我们通过将my_function函数传递给decorator装饰器来创建一个装饰函数decorated_function。最后,我们打印decorated_function的__name__和__doc__属性,可以看到它们与my_function的属性相同。

接下来,我们来看一下update_wrapper函数的用法:

Python

import functools

def decorator(func):

def wrapper(*args, <strong>kwargs):

"""This is a wrapper function."""

print("Decorator wrapper")

return func(*args, </strong>kwargs)

return functools.update_wrapper(wrapper, func)

def my_function():

"""This is my function."""

print("Original function")

decorated_function = decorator(my_function)

print(decorated_function.__name__) # 输出: my_function

print(decorated_function.__doc__) # 输出: This is my function.

在上面的例子中,我们定义了一个decorator函数,它没有使用wraps装饰器,而是手动调用update_wrapper函数将wrapper函数的元数据复制到func函数上。然后,我们通过将my_function函数传递给decorator装饰器来创建一个装饰函数decorated_function。最后,我们打印decorated_function的__name__和__doc__属性,可以看到它们与my_function的属性相同。

区别和用法

通过以上的例子,我们可以看出functools.wraps和functools.update_wrapper的使用方式略有不同。wraps是一个装饰器函数,可以直接将其放在装饰器函数的定义上方,使其自动复制被装饰函数的元数据。而update_wrapper是一个普通的函数,需要手动调用,并将源函数和目标函数作为参数传递给它。此外,wraps返回的是一个装饰器,而update_wrapper返回的是更新后的目标函数。

functools.wraps和functools.update_wrapper是Python中用于装饰器的工具函数,用于复制一个函数的元数据到另一个函数上。它们的目的是相同的,但实现方式和用法略有不同。wraps是一个装饰器函数,可以自动复制被装饰函数的元数据,而update_wrapper是一个普通的函数,需要手动调用,并将源函数和目标函数作为参数传递给它。

案例代码

Python

import functools

def decorator(func):

@functools.wraps(func)

def wrapper(*args, <strong>kwargs):

"""This is a wrapper function."""

print("Decorator wrapper")

return func(*args, </strong>kwargs)

return wrapper

def my_function():

"""This is my function."""

print("Original function")

decorated_function = decorator(my_function)

print(decorated_function.__name__) # 输出: my_function

print(decorated_function.__doc__) # 输出: This is my function.

Python

import functools

def decorator(func):

def wrapper(*args, <strong>kwargs):

"""This is a wrapper function."""

print("Decorator wrapper")

return func(*args, </strong>kwargs)

return functools.update_wrapper(wrapper, func)

def my_function():

"""This is my function."""

print("Original function")

decorated_function = decorator(my_function)

print(decorated_function.__name__) # 输出: my_function

print(decorated_function.__doc__) # 输出: This is my function.

以上是关于functools.wraps和functools.update_wrapper的介绍和用法,希望对你有所帮助。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号