0

我正在尝试在我的 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()通话时括号放错了位置。现在我有另一个问题,该方法只是返回无。我不知道这是否意味着返回 None 的super实现all()(也许它不知道是什么实体在调用它?)或者只是我的代码存在其他一些错误。

4

1 回答 1

0

我认为错误可能在这里:

logging.info(list(super(Item, cls.all())))

如果 中存在错误cls.all(),则作为构造函数的一部分再次super调用它,而不是在结果上调用它:

logging.info(list(super(Item, cls).all()))

因此,如果再次调用错误all,它仍然会满足日志分支条件,它将all再次调用,仍然会等等,直到你达到递归限制。

另一个可能的问题是Model.all()返回一个Query对象,我不确定是否list(query)有效。它还提供了自己的排序,因此您可以使用它来代替:

    query = super(Item, cls).all()
    query.order( order )
    ...
return list(query)

或者只是return query,因为它已经是可迭代的。

于 2012-09-18T06:16:29.713 回答