2017-03-24 19 views
1

Google App EngineのNDBデータストアの非同期APIで使用するために作成したタスクレットで何が起こっているのかを理解するのは少し難しいです。概要は次のとおりです。ユーザーの購入履歴をまとめ、「UserPurchase」オブジェクトは購入した「製品」または「カスタム」アイテムと購入した「施設」を参照し、KeyProperty UserPurchase ndb.Modelのプロパティ。私は可能な限り様々なNDB検索を並列化したいので、私は(https://cloud.google.com/appengine/docs/standard/python/ndb/asyncで)NDBのドキュメントに非常に近い立ち往生し、3つのタスクレット構築しました:ndb.taskletsをGoogle App Engineで動作させるのが難しい

:次に

@ndb.tasklet 
def get_establishment(purch): 
    resto = yield purch.p_establishment.get_async() 
    ret = { 
     "rkey": resto.key.urlsafe(), 
     "rname": resto.resto_name 
    } 
    raise ndb.Return(ret) 

@ndb.tasklet 
def get_item(purch): 
    item = yield purch.p_item.get_async() 
    if (purch.p_item.kind() == "Product"): 
     ret = { 
      "ikey": item.key.urlsafe(), 
      "iname": item.name 
     } 
    else: 
     ret = { 
      "ikey": item.key.urlsafe(), 
      "iname": item.cust_name 
     } 
    raise ndb.Return(ret) 

@ndb.tasklet 
def load_history(purch): 
    at, item = yield get_establishment(purch), get_item(purch) 
    ret = { 
     "date": purch.p_datetime, 
     "at_key": at.rkey, 
     "at": at.rname, 
     "item_key": item.ikey, 
     "item": item.iname, 
     "qty": purch.p_quantity, 
     "type": purch.p_type 
    } 
    raise ndb.Return(ret) 

を、私はそうのように電話をかけます

pq = UserPurchase.query().order(-UserPurchase.p_datetime) 
phistory = pq.map(load_history, limit = 20) 

表示のための最新の20件の購入を取得します。しかし、私はそれを実行すると、私は何を作るのか分からないという奇妙な例外があります...そして、私はタスクレットで十分に精通しておらず、何が起こっているのか自信を持って言います。もし誰かが私に何を探すべきかを指摘できたら、本当に感謝しています...!エラーに基づいて

 ... 
     File "/Programming/VirtualCellar/server/virtsom.py", line 2348, in get 
     phistory = pq.map(load_history, limit = 20) 
     File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/utils.py", line 160, in positional_wrapper 
     return wrapped(*args, **kwds) 
     File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/query.py", line 1190, in map 
     **q_options).get_result() 
     File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 383, in get_result 
     self.check_success() 
     File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 624, in _finish 
     result = [r.get_result() for r in self._results] 
     File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 383, in get_result 
     self.check_success() 
     File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 430, in _help_tasklet_along 
     value = gen.send(val) 
     File "/Programming/VirtualCellar/server/virtsom.py", line 2274, in load_history 
     "at_key": at.rkey, 
    AttributeError: 'dict' object has no attribute 'rkey' 

タスクレットは辞書を返す好きではないように、それはほとんど思えるあなたはエラーメッセージを誤って解釈している...

答えて

1

:ここで私は、私は上記のコードを実行すると取得の例外があります: dictが返されますが、存在しないdictの属性にアクセスしようとしています。

ので、その後load_historyの内側に変更する場合、あなたがに辞書のatribute、ないのdict内の値にアクセスするに表示されます。

 "at_key": at.rkey, 

へ:

 "at_key": at.get('rkey'), 

または:

 "at_key": at['rkey'], 

atitem dictsの他のdict値にアクセスする他の同様の試みをもう一度見直したい場合もあります。

+0

ありがとうございました!私はいつもdict.propertyとdict ["property"]がPythonで同じだと思っていたので、これはうまくいったのですが、混乱してしまいました。なぜなら、Pythonコードの残りの部分の大部分がまったく....! –

+0

'dict.property'はdictオブジェクト(任意のdictオブジェクトです)のプロパティですが、' dict ["key"] 'はdict内部の' 'key ':value'ペアに対応する値ですそれはdictオブジェクトのプロパティではありません。 –

+0

Hehe、私が取り組んでいるプロジェクトでは、JavascriptとPythonの両方のコーディングをしています.2つの言語の構文が混乱していると思います。 :) –

関連する問題