gpt4 book ai didi

python - functools.wraps 有什么作用?

转载 作者:IT老高 更新时间:2023-10-28 12:01:19 30 4
gpt4 key购买 nike

在评论中 answer to another question ,有人说他们不确定 functools.wraps 在做什么。所以,我问这个问题,以便在 StackOverflow 上记录它以供将来引用:functools.wraps 到底是做什么的?

最佳答案

当您使用装饰器时,您是在用另一个函数替换一个函数。换句话说,如果你有一个装饰器

def logged(func):
def with_logging(*args, **kwargs):
print(func.__name__ + " was called")
return func(*args, **kwargs)
return with_logging

那么当你说

@logged
def f(x):
"""does some math"""
return x + x * x

和说的一模一样

def f(x):
"""does some math"""
return x + x * x
f = logged(f)

你的函数 f 被替换为函数 with_logging。不幸的是,这意味着如果你说

print(f.__name__)

它将打印 with_logging 因为那是你的新函数的名称。实际上,如果您查看 f 的文档字符串,它会是空白的,因为 with_logging 没有文档字符串,因此您编写的文档字符串将不再存在。此外,如果您查看该函数的 pydoc 结果,它不会被列为采用一个参数 x;相反,它将被列为采用 *args**kwargs 因为这就是 with_logging 所采用的。

如果使用装饰器总是意味着丢失有关函数的信息,那将是一个严重的问题。这就是我们有 functools.wraps 的原因。这需要一个装饰器中使用的函数,并添加复制函数名称、文档字符串、参数列表等的功能。由于 wraps 本身就是一个装饰器,因此以下代码可以做正确的事情:

from functools import wraps
def logged(func):
@wraps(func)
def with_logging(*args, **kwargs):
print(func.__name__ + " was called")
return func(*args, **kwargs)
return with_logging

@logged
def f(x):
"""does some math"""
return x + x * x

print(f.__name__) # prints 'f'
print(f.__doc__) # prints 'does some math'

关于python - functools.wraps 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/308999/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com