在python google app引擎中覆盖db.Model.all()

时间:2012-09-18 01:25:38

标签: python google-app-engine superclass method-overriding

我正在尝试在我的Google App Engine应用中使用memcache。我决定只重写我的Model的all()类方法,而不是创建一个检查memcache然后查询数据库的函数。到目前为止,这是我的代码:

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方法:

super(supercls, cls_or_self)

但这不适用于GAE的API:

super(db.Model, cls)

这不知道要查询哪个模型。有人请告诉我我做错了什么,也许让我更好地了解super()。

编辑:感谢@Matthew,问题在第一次 logging.info()电话中被证明是错误的括号。现在我有另一个问题,该方法只是返回None。我不知道这是否意味着super的{​​{1}}实现返回None(也许它不知道实体正在调用它?)或者我的代码中还有其他一些错误。< / p>

1 个答案:

答案 0 :(得分:0)

我认为错误可能在这里:

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

如果cls.all()中出现错误,则将其作为<{1}}构造函数的一部分再次调用 ,而不是在结果上调用它:

super

因此,如果错误再次调用logging.info(list(super(Item, cls).all())) ,它仍会满足日志记录分支条件,这将再次调用all,这仍然等等,直到您达到递归限制。

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

list(query)

或只是 query = super(Item, cls).all() query.order( order ) ... return list(query) ,因为它已经可以迭代了。