如何解决@reify 每次调用都执行数据库查询?
基于 this comment 关于 reify,
它的作用类似于@property,只是该函数只被调用一次;之后,该值被缓存为常规属性。这使您可以在不可变的对象上延迟创建属性。
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 举报,一经查实,本站将立刻删除。