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()
(おそらく、どのエンティティがそれを呼び出しているのかわからないのでしょうか?)、それとも私のコードに他のバグがあるだけなのかはわかりません。