我正在使用Python 3.4.3的龍捲風和電機。什麼時候會在函數調用堆棧中產生實際產量?
我有三個文件。讓我們將其命名爲像main.py
,model.py
,core.py
我有三個功能,一是在各...
main.py
def getLoggedIn(request_handler):
# request_handler = tornado.web.RequestHandler()
db = request_handler.settings["db"]
uid = request_handler.get_secure_cookie("uid")
result = model.Session.get(db, uid=uid)
return result.get("_id", None) if result else None
model.py
@classmethod
def get(cls, db, user_id=None, **kwargs):
session = core.Session(db)
return session.get(user_id, **kwargs)
core.py
@gen.coroutine
def get(self, user_id, **kwargs):
params = kwargs
if user_id:
params.update({"_id": ObjectId(user_id)}) #This does not exist in DB
future = self.collection.find_one(params)
print(future) #prints <tornado.concurrent.Future object at 0x04152A90>
result = yield future
print(result) #prints None
return result
的調用看起來像getLoggedIn
=>model.get
=>core.get
core.get裝飾有@gen.coroutine
和我打電話yield self.collection.find_one(params)
的print(result)
打印None
,但如果我返回結果,並嘗試在其打印的getLoggedIn
函數中打印返回值。
我相信這與龍捲風的異步性質有關,打印在打印之前被調用,但我不確定。如果有人能夠在不同的可能情況下解釋協程/生成器的原理和行爲,這將是一個很大的幫助。
'print(future)'做什麼? –
我刪除了我以前的評論,因爲我現在看到這是你問題的一部分。你期望'結果=收益未來'做什麼?我認爲這將是一個語法錯誤。這並不令我感到意外;它給了「沒有」讓我感到驚訝。 'yield'的用法與'return'大致相似,但設置了一個生成器並保存了函數狀態。 –
print(future)打印Future對象並打印(結果)打印無 – Mayank