Python 了解functools.wrapps

Python 了解functools.wrapps,python,Python,我正在使用Flask RESTful,并尝试使用该技术显示我的REST端点 主要代码是 def authenticate(func): @wraps(func) def wrapper(*args, **kwargs): if not getattr(func, 'authenticated', True): return func(*args, **kwargs) acct = basic_authentication(

我正在使用Flask RESTful,并尝试使用该技术显示我的REST端点

主要代码是

def authenticate(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not getattr(func, 'authenticated', True):
            return func(*args, **kwargs)

        acct = basic_authentication()  # custom account lookup function

        if acct:
            return func(*args, **kwargs)

        restful.abort(401)
    return wrapper


class Resource(restful.Resource):
    method_decorators = [authenticate]   # applies to all inherited resources
我也用同样的方法做了,但我不确定
@wraps

这对我来说似乎很神奇,我不明白下面的内容

a、 )似乎用
@wrapps
包装的函数被传递给了包装器,那么包装器返回了什么

可能的答案:最初传递给函数的所有内容

如果是,我如何将更多信息(如
acct
对象)与所有内容一起传递,以便我的函数接收account对象,而不必为其执行数据库获取

更新 根据该示例,我的rest端点如下所示

class UserResource(RestResource):
    def get(self, uuid):
        return {'method': 'get user -> ' + uuid}
我把它叫做

curl -X GET http://127.0.0.1:5000/users/validUUID
现在,当我的每个请求都经过身份验证时,我会查看是否存在有效的
acct
对象,如果它存在,我会将控件委托给端点

问题
由于我实际上是在进行一次数据库调用以查找
acct
对象,因此当找到有效的
acct
时,是否可以将其传递到端点

这样会发生两件事
a、 )我知道电话已通过身份验证
b、 )我重复使用
acct
对象,我可以将其用于我的进一步工作,而不是再次进行DB调用并再次从ValidUID获取
acct
对象


如何实现这一点?

authenticate
是一个修饰符——它接受一个函数并返回该函数的修改版本(通常通过包装函数并包装它来实现)

现在,包装器的问题在于,它们在某些方面的行为与原始函数并不完全相同——它们可能缺少docstring,具有错误的
\uuuuu name\uuuuuuuu
wrapper
,而不是它应该被调用的内容)和其他缺陷。如果其他代码正在使用这些额外信息,这可能很重要
functools.wrapps
是一个简单的函数,它将原始函数(此处为
func
)中的信息添加到包装函数中,因此它的行为更像原始函数。(从技术上讲,它本身就是一个装饰器,这是令人困惑的部分,但您不必担心这个细节。只需知道它是一个很好的工具,可以将属性从包装函数复制到包装函数)

因此,当你写作时

new_function = authenticate(old_function)
或者更常见

@authenticate
def function(...)

new\u function
看起来更像
old\u function

authenticate
是一个装饰器——它接受一个函数并返回该函数的修改版本(通常通过包装函数并包装它来实现)

现在,包装器的问题在于,它们在某些方面的行为与原始函数并不完全相同——它们可能缺少docstring,具有错误的
\uuuuu name\uuuuuuuu
wrapper
,而不是它应该被调用的内容)和其他缺陷。如果其他代码正在使用这些额外信息,这可能很重要
functools.wrapps
是一个简单的函数,它将原始函数(此处为
func
)中的信息添加到包装函数中,因此它的行为更像原始函数。(从技术上讲,它本身就是一个装饰器,这是令人困惑的部分,但您不必担心这个细节。只需知道它是一个很好的工具,可以将属性从包装函数复制到包装函数)

因此,当你写作时

new_function = authenticate(old_function)
或者更常见

@authenticate
def function(...)

new\u function
将看起来更像
old\u function

谢谢@nneonneo,我刚刚添加了更新,看看我所做的是否可以实现,请让我知道我必须承认我不太理解你的更新要求。谢谢@nneonneo,我刚刚添加了更新,看看我所做的是否可以实现,请让我知道我必须承认我不太明白你的更新要求什么。