微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

@reify 每次调用都执行数据库查询?

如何解决@reify 每次调用都执行数据库查询?

基于 this comment 关于 reify,

它的作用类似于@property,只是该函数只被调用一次;之后,该值被缓存为常规属性。这使您可以在不可变的对象上延迟创建属性

我有这个自定义 reify 类:

class reify(object):
    def __init__(self,wrapped):
        self.wrapped = wrapped

    def __get__(self,inst):
        if inst is None:
            return self
        val = self.wrapped(inst)
        setattr(inst,self.wrapped.__name__,val)
        return val

它的用法如下:

@reify
def user_details(self,user_id):
    try:
        # function that executes db query,returns dict
        return user_details_from_id(self._dbconn,user_id)
    except Exception as e:
        pass

显然,我们只需执行 name = self.user_details.get("name") 即可使用它。

这按预期工作,但不确定这是在每次调用时缓存结果还是执行查询,我该如何确认?我的意思是这个实现正确吗? (没有数据库控制台)

解决方法

def user_details(self,user_id) 这样的签名有太多的参数,@reify 甚至 @property 都无法支持。它应该是 def user_details(self)reify 装饰器然后将修改属性 self.user_details 以在实例的持续时间内返回相同的值。请注意,它不是全局的,而是每个实例的,因为它使用 self。要确认它正在缓存,您只需在 user_details 函数中放置打印语句,以确认每个实例仅调用一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。