首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解functools.wraps

理解functools.wraps
EN

Stack Overflow用户
提问于 2013-04-09 04:29:36
回答 1查看 320关注 0票数 0

我使用的是烧瓶-RESTful,并试图使用显示了这里的技术来获得我的休息端点。

主要代码是

代码语言:javascript
复制
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.)似乎用@wraps包装的函数被传递给包装器,那么包装器返回的是什么?

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

如果是的话,我如何传递更多的信息,比如acct对象,这样我的函数就可以接收帐户对象,而不必为其进行数据库提取了?

基于示例的更新,我的rest端点看起来像

代码语言:javascript
复制
class UserResource(RestResource):
    def get(self, uuid):
        return {'method': 'get user -> ' + uuid}

我把它叫做

代码语言:javascript
复制
curl -X GET http://127.0.0.1:5000/users/validUUID

现在,当我的每个请求都经过身份验证时,我将看到是否存在有效的acct对象,如果它存在,则将控件委托给端点。

问题

由于我实际上是在进行一个数据库调用来查找acct对象,那么当一个有效的acct被找到时,是否可以将它传递给端点呢?

这样两件事就会发生

a.)我知道这个电话是经过认证的

b.)我重用可以用于进一步工作的acct对象,而不是再次调用DB并再次从validUUID获取acct对象。

我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-09 04:35:27

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

现在,包装器的问题是,它们在某些方面通常不完全像原始函数--它们可能缺少文档字符串,有错误的__name__ (wrapper而不是应该调用的),以及其他缺陷。如果其他代码正在使用这些额外信息,这可能是很重要的。functools.wraps是一个简单的函数,它将原始函数(此处为func)中的信息添加到包装器函数中,因此它的行为更像原始函数。(从技术上讲,它本身就是一个装潢师,这是令人困惑的地方,但你不必担心这个细节。只需知道,它是一个很好的工具,可以将属性从包装函数复制到包装函数)。

因此,当你写

代码语言:javascript
复制
new_function = authenticate(old_function)

或者更常见

代码语言:javascript
复制
@authenticate
def function(...)

new_function看起来更像old_function

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15893321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档