0

Google App Engine アプリで memcache の使用を開始しようとしています。memcache をチェックしてデータベースにクエリを実行する関数を作成する代わりに、モデルの 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() メソッドの誤解によるものだと思います。注文でコードが乱雑になって申し訳ありません。しかし、問題はそこにもあるのかもしれません。私が見つけた1つの場所では、スーパーメソッドは次のように呼び出す必要があると書かれていました:

super(supercls, cls_or_self)

しかし、これは GAE の API では機能しません。

super(db.Model, cls)

これは、どのモデルを照会するかを知りません。誰かが私が間違っていることを教えてください。

logging.info()編集: @Matthew のおかげで、問題は最初の呼び出しで括弧の位置が間違っていることが判明しました。今、私は別の問題を抱えています.メソッドはNoneを返すだけです. superの実装が None を返すことを意味するのか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 に答える