Google App Engine の ndb は、_post_put_hook(self, future)
次のように文書化された を提供します。
put() の後に実行されるフック
このフックをよりよく理解するために、いつ引数self
の結果と異なるのか疑問に思っています。future
モデル フックのドキュメントには、次の情報が記載されています。
非同期 API でポストフックを使用する場合、フックは、check_result()、get_result() を呼び出すか、(タスクレット内で) 非同期メソッドの future を生成することによってトリガーされます。Post フックは、RPC が成功したかどうかをチェックしません。フックは失敗に関係なく実行されます。
すべての post-hook には、呼び出し署名の最後に Future 引数があります。この Future オブジェクトは、アクションの結果を保持します。この Future で get_result() を呼び出して、結果を取得できます。フックが呼び出されるまでに Future が完了しているため、 get_result() がブロックされないことを確認できます。
ただし、次のようにput
非同期で呼び出すと:
from google.appengine.ext import ndb
class MyModel(ndb.Model):
xyz = ndb.StringProperty()
def _post_put_hook(self, future):
print "self.xyz: {}, future.xyz: {}".format(
self.xyz, future.get_result().get().xyz))
m = MyModel()
f = m.put_async()
f.wait()
m.xyz = 'abc'
f = m.put_async()
f.wait()
出力:
self.xyz: None, future.xyz: None
self.xyz: abc, future.xyz: abc
self
「put_async」のコンテキストでは、が変更前のモデルであり、future
が現在保存されているモデルであると合理的に期待できると思います。future
それ以外の場合、put
コンテキストでどのような目的があるかは明確ではありません。
のコンテキストでself
とが異なるのはいつですか? ここの目的は何ですか?future
put
future