【发布时间】:2012-09-18 01:25:38
【问题描述】:
我正在尝试在我的 Google App Engine 应用中开始使用内存缓存。我没有创建一个检查内存缓存然后可能查询数据库的函数,而是决定重写我的模型的 all() 类方法。到目前为止,这是我的代码:
def all(cls, order=None):
result = memcache.get("allitems")
if not result or not memcache.get("updateitems"):
logging.info(list(super(Item, cls.all())))
result = list(super(Item, cls).all()).sort(key=lambda x: getattr(x, order) if order else str(x))
memcache.set("allitems", result)
memcache.set("updateitems", True)
logging.info("DB Query for items")
return result
我认为这会奏效。但相反,我得到一个 RuntimeError 说超出了递归深度。我认为这来自对 super() 方法的误解。很抱歉把代码和订购的东西弄乱了。但也许问题也出在某个地方。我发现一个地方说超级方法应该这样调用:
super(supercls, cls_or_self)
但这不适用于 GAE 的 API:
super(db.Model, cls)
这不知道要查询哪个模型。有人请告诉我我做错了什么,也许让我更好地理解 super()。
编辑:感谢@Matthew,问题出在第一个 logging.info() 调用中的括号放错了位置。现在我有另一个问题,该方法只是返回无。我不知道这是否意味着 all() 的 super 实现返回 None (也许它不知道是什么实体在调用它?)或者只是我的代码存在其他错误。
【问题讨论】:
-
考虑切换到 NDB,您可以在其中自动缓存开箱即用。这很酷:developers.google.com/appengine/docs/python/ndb
标签: python google-app-engine superclass overriding